0

という名前の 1 つのテンプレートを使用して、1 つの文字列key6='||1-LIW-3324|1-LIW-3325|1-LIW-3326|1-LIW-3327|1-LIW-4232'をセパレーターで分割しました。このテンプレートを別のテンプレートから呼び出しました。したがって、各分割値は に格納されます。ここで、呼び出し元のテンプレートで各分割 node( ) を参照し、分割/分割された各ノードを別の変数と比較したいと考えています。どうすればできますか。'|'StringSplitStringSplitSeparatedLineItemsSeparatedLineItems

これがコードです。

<xsl:template match="/">
    <xsl:variable name="check3">
        <xsl:value-of select="1-LIW-3"/>
    </xsl:variable>

    <myProj>
    <xsl:call-template name="StringSplit">
            <xsl:with-param name="val" select="$key6"/>
    </xsl:call-template>

    <!--here I want to compare "SeperatedLineItems" with $check3 -->                   
    <!--<xsl:variable name="con"> 
        <xsl:value-of select="contains($key6,$check3)"/> 
    </xsl:variable>-->        
    </myProj>

</xsl:template>

<xsl:template name="StringSplit">
    <xsl:param name="val" select="$key6"/>
    <!-- do a check to see if the input string (still) has a "|" in it -->
    <xsl:choose>
        <xsl:when test="contains($val, '|')">
            <!-- pull out the value of the string before the "|" delimiter -->
            <SeperatedLineItems>
                <xsl:value-of select="substring-before($val, '|')"/>
            </SeperatedLineItems> 
            <!-- recursively call this template and pass in value AFTER the "|" delimiter -->
            <xsl:call-template name="StringSplit">
                <xsl:with-param name="val" select="substring-after($val, '|')"/> 
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <!-- if there is no more delimiter values, print out the whole string -->
            <SeperatedLineItems>
                <xsl:value-of select="$val"/>
            </SeperatedLineItems>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

4

1 に答える 1

0

この XSLT 1.0 スタイルシートは、テンプレートを呼び出して返される要素にアクセスする方法を示しています ...

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="xsl msxsl">
<xsl:output method="text"/>

<xsl:variable name="key6" select="'||1-LIW-3324|1-LIW-3325|1-LIW-3326|1-LIW-3327|1-LIW-4232'" />  

<xsl:template match="/">
Does my $key6 variable contain precisely '1-LIW-3'?
 <xsl:variable name="keys"> 
  <xsl:call-template name="StringSplit">
    <xsl:with-param name="val" select="$key6"/>
  </xsl:call-template>
 </xsl:variable>
 <xsl:choose> 
   <xsl:when test="msxsl:node-set($keys)/*[. = '1-LIW-3']">
    YES
  </xsl:when>
  <xsl:otherwise> 
    NO
  </xsl:otherwise> 
 </xsl:choose> 
</xsl:template>

<xsl:template name="StringSplit">
  <xsl:param name="val" />
  <xsl:choose>
   <xsl:when test="contains($val,'|')">
    <SeperatedLineItems>
      <xsl:value-of select="substring-before($val,'|')" />
    </SeperatedLineItems>
    <xsl:variable name="remainder"> 
     <xsl:call-template name="StringSplit">
       <xsl:with-param name="val" select="substring-after($val,'|')" />
     </xsl:call-template>
    </xsl:variable>
    <xsl:copy-of select="msxsl:node-set($remainder)/*" /> 
   </xsl:when>
   <xsl:when test="$val != ''">
    <SeperatedLineItems>
      <xsl:value-of select="$val" />
    </SeperatedLineItems>
  </xsl:when>
  <xsl:otherwise> 
  </xsl:otherwise> 
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

結果はどちらへ…

Does my $key6 variable contain '1-LIW-3'?

    NO

そして、これが XSLT 2.0 に相当するものです...

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  exclude-result-prefixes="xsl xs">
<xsl:output method="text"/>

<xsl:variable name="key6" select="'||1-LIW-3324|1-LIW-3325|1-LIW-3326|1-LIW-3327|1-LIW-4232'" />  

<xsl:template match="/">
Does my $key6 variable contain precisely '1-LIW-3'?
 <xsl:variable name="keys" select="tokenize($key6,'\|')" as="xs:string*" /> 
 <xsl:choose> 
   <xsl:when test="some $key in $keys satisfies ($key = '1-LIW-3')">
    YES
  </xsl:when>
  <xsl:otherwise> 
    NO
  </xsl:otherwise> 
 </xsl:choose> 
</xsl:template>

</xsl:stylesheet>

上記は $keys 変数を、文字列を含む要素ではなく文字列のシーケンスにします。要素を好む場合は、次の代替手段を使用できます。この代替手段には、空の文字列項目が含まれていないという欠点があります。

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  exclude-result-prefixes="xsl xs">
<xsl:output method="text"/>

<xsl:variable name="key6" select="'||1-LIW-3324|1-LIW-3325|1-LIW-3326|1-LIW-3327|1-LIW-4232'" />  

<xsl:template match="/">
Does my $key6 variable contain precisely '1-LIW-3'?
 <xsl:variable name="keys" as="element()*" > 
  <xsl:analyze-string select="concat($key6,'|')" regex="([^\|]*)\|">
   <xsl:matching-substring>  
    <SeperatedLineItems>
     <xsl:value-of select="regex-group(1)" />
    </SeperatedLineItems>
   </xsl:matching-substring>  
  </xsl:analyze-string> 
 </xsl:variable> 
 <xsl:choose> 
   <xsl:when test="$keys[. = '1-LIW-3']">
    YES
  </xsl:when>
  <xsl:otherwise> 
    NO
  </xsl:otherwise> 
 </xsl:choose> 
</xsl:template>

</xsl:stylesheet>
于 2012-07-25T17:52:24.810 に答える