2017-04-18 12 views
0

私は、優先順位@schemeNamesに基づいて値を取得するための要件が​​あります。 @ schemeName = 'TaxNumber'がある場合はIDの値を取得し、@ schemeName = 'PassportNumber'の場合はIDの値を取得し、@schemeNameが値でない場合はIDの値を取得します。値を取得したら、最初の2文字がアルファであるかどうかをチェックしたり、無視したりする必要があります。また、@schemeNameの単語間のスペースも考慮する必要があります。たとえば、私の@schemeNameの値が 'Tax Number'または 'taxnumber'の場合、それは有効です。しかし、値がこのような場合、 't axNum Ber'は、この値を検証すべきではありません。正規表現パターンを使用するXSLT

は、ここに私のXSLTです:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
    <Result> 
     <xsl:for-each select="/Record/Data/ID"> 
      <xsl:choose> 
       <xsl:when test="matches(lower-case(.[@schemeName]),'^tax\s+number')"> 
        <xsl:if test="matches(substring(.,1,2),'^[a-zA-Z]+$')"> 
         <xsl:value-of select="substring(.,3)"/> 
        </xsl:if> 
       </xsl:when> 
       <xsl:when test="matches(lower-case(.[@schemeName]),'^passport\s+number')"> 
        <xsl:if test="matches(substring(.,1,2),'^[a-zA-Z]+$')"> 
         <xsl:value-of select="substring(.,3)"/> 
        </xsl:if> 
       </xsl:when> 
       <xsl:when test=".[@schemeName='']"> 
        <xsl:if test="matches(substring(.,1,2),'^[a-zA-Z]+$')"> 
         <xsl:value-of select="substring(.,3)"/> 
        </xsl:if> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:for-each> 
    </Result> 
</xsl:template> 
</xsl:stylesheet> 

INPUT:

<Record> 
    <Data> 
    <ID schemeName="TaxNumber">PT123457</ID> 
    <ID schemeName="PassportNumber">PT098732</ID> 
    <ID schemeName="LicenseNumber">PT445423</ID> 
    <ID schemeName="">PT7566435</ID> 
</Data> 
</Record> 

生成される出力:

<Result>7566435</Result> 

が生成される出力がnullの@schemeNameから来ています。 TaxNumberが存在するのでTaxNumberから来るはずです。 @schemeNamesをチェックするときに私の状態に何か問題があります。

私はXSLT v2.0を使用しています。ありがとうございました!

答えて

0

変数で優先順位を設定することはどうですか?以下のような何か:

<xsl:variable name="prio1" select="ID[matches(lower-case(@schemeName),'^tax\s?number')]"/> 
    <xsl:variable name="prio1_value"> 
     <xsl:choose> 
      <xsl:when test="matches($prio1, '^[A-z]{2}.*$')"> 
       <xsl:value-of select="substring($prio1,3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$prio1"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:variable name="prio2" select="ID[matches(lower-case(@schemeName),'^passport\s?number')]"/> 
    <xsl:variable name="prio2_value"> 
     <xsl:choose> 
      <xsl:when test="matches($prio2, '^[A-z]{2}.*$')"> 
       <xsl:value-of select="substring($prio2,3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$prio2"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:variable name="prio3" select="ID[@schemeName='']"/> 
    <xsl:variable name="prio3_value"> 
     <xsl:choose> 
      <xsl:when test="matches($prio3, '^[A-z]{2}.*$')"> 
       <xsl:value-of select="substring($prio3,3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$prio3"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

注:私はスペースをオプションにする\s?\s+を変更しました。

また、if-then-else構文をxslt 2.0に使用することもできます。最終的なコードは次のとおりです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 


    <xsl:template match="/"> 
     <xsl:apply-templates select="Record/Data"/> 
    </xsl:template> 

    <xsl:template match="Data"> 
    <xsl:variable name="prio1" select="ID[matches(lower-case(@schemeName),'^tax\s?number')]"/> 
    <xsl:variable name="prio1_value"> 
     <xsl:choose> 
      <xsl:when test="matches($prio1, '^[A-z]{2}.*$')"> 
       <xsl:value-of select="substring($prio1,3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$prio1"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:variable name="prio2" select="ID[matches(lower-case(@schemeName),'^passport\s?number')]"/> 
    <xsl:variable name="prio2_value"> 
     <xsl:choose> 
      <xsl:when test="matches($prio2, '^[A-z]{2}.*$')"> 
       <xsl:value-of select="substring($prio2,3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$prio2"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:variable name="prio3" select="ID[@schemeName='']"/> 
    <xsl:variable name="prio3_value"> 
     <xsl:choose> 
      <xsl:when test="matches($prio3, '^[A-z]{2}.*$')"> 
       <xsl:value-of select="substring($prio3,3)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$prio3"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <Result> 
     <xsl:value-of select="if ($prio1) then ($prio1_value) else 
     if ($prio2) then ($prio2_value) else 
     if ($prio3) then ($prio3_value) else 0"/> 
    </Result> 

    </xsl:template> 

</xsl:stylesheet> 
+0

フィードバックありがとうございます。それはうまくいきましたが、唯一の問題は最初の2文字がアルファであるかどうかを確認することです。他のポジションに手紙があるかどうかは関係ありません。 – Nathan

+0

有効なschemeNameで、最初の2文字がアルファでない場合、出力はありませんか? –

+0

有効なschemeNameで、最初の2文字がアルファでない場合は、そのまま値を取得します。 – Nathan