2017-02-09 27 views
0

XSLファイルで変換しようとしている以下のXML部分があります。別の属性のワイルドカードの一致に基づく属性の更新

XMLファイルのサンプル:

<data> 
    <KEY name="B1F" value="Smith" /> 
    <KEY name="B1L" value="Johnson" /> 
    <KEY name="B2F" value="Nancy" /> 
    <KEY name="B2L" value="Drew" /> 
    <KEY name="B1Phone" value="123-456-7890" /> 
    <KEY name="B1SSN" value="123-45-6789" /> 
    <KEY name="B1Address" value="1234 Highway 102" /> 
    <KEY name="B2Phone" value="123-456-7890" /> 
    <KEY name="B2SSN" value="123-45-6789" /> 
    <KEY name="B2Address" value="1234 Highway 102" /> 
    <KEY name="B7SSN" value="987-65-4321" /> 
    <KEY name="B8F" value="George" /> 
    <KEY name="B8L" value="Lucas" /> 
</data> 

現在のXSLの抜粋:

<xsl:variable name="ReplaceLiveDate" select="false()"/> 
<xsl:variable name="BDOB" select="1990-01-01"/> 
<xsl:variable name="BF">Test Borrower</xsl:variable> 
<xsl:variable name="BL">Last Name</xsl:variable> 
<xsl:variable name="BPhone" select="5551234567" /> 
<xsl:variable name="BSSN" select="555112345" /> 
<xsl:variable name="Address">Test Address</xsl:variable> 

<!-- in DATA: output KEY sorted by @name --> 
<xsl:template match="DATA"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select="KEY"> 
      <xsl:sort select="@name" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<!-- output KEY verbatim --> 
<xsl:template match="KEY"> 
    <xsl:copy-of select="." /> 
</xsl:template> 

<!-- Start of the conversion for Live Data to Test 
    need to repeat or wildcard for each instance 
<xsl:template match="KEY[@name='B1L']"> 
    <xsl:copy> 
     <xsl:when test="$ReplaceLiveDate = false()"> 
       <xsl:apply-templates select="node()|@*"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <KEY value="$BL"> 
       <xsl:apply-templates select="@*[not(name()='value')] | node()"/> 
      </KEY> 
     </xsl:otherwise> 
    </xsl:copy> 
</xsl:template>--> 
    私のようなワイルドカードで、 "名前" の属性値をテストできるようにしたいと思い
  1. 」最大8つのインスタンスが存在する可能性があるため、「B?L」または「B [1-8] L」と表示されますが、選択したステートメントにRegExを適用する方法が不明です。

  2. @value属性の値をXSLの上部で宣言された変数の値で更新したいとします(現在はすべての変数が設定されていますが、テンプレートは "B1L"置換値のためにのみリストされています)。

コードの非コメント部分は問題なく動作しますが、コメント部分は必要に応じて機能しません。

期待される結果:

<data> 
    <KEY name="B1F" value="Test Borrower" /> 
    <KEY name="B1L" value="Last Name" /> 
    <KEY name="B2F" value="Test Borrower" /> 
    <KEY name="B2L" value="Last Name" /> 
    <KEY name="B1Phone" value="5551234567" /> 
    <KEY name="B1SSN" value="555112345" /> 
    <KEY name="B1Address" value="Test Address" /> 
    <KEY name="B2Phone" value="5551234567" /> 
    <KEY name="B2SSN" value="555112345" /> 
    <KEY name="B2Address" value="Test Address" /> 
    <KEY name="B7SSN" value="555112345" /> 
    <KEY name="B8F" value="Test Borrower" /> 
    <KEY name="B8L" value="Last Name" /> 
</data> 

この問題であなたの助けのために事前にありがとうございます。

+1

あなたはXSLT2.0を使用していますか?あなたのプロセッサがそれを拡張としてサポートしていない限り、XSLT 1.0に正規表現のサポートはありません。 - P.S.テストがどんなものであるべきか、それぞれの場合に期待される結果は何かを明確にしてください。 –

+0

私が使用しているxslのバージョンは1.0ですが、問題なく2.0に変換できます。 期待された結果として、上に追加します – mike

+0

XSLT 2.0プロセッサに切り替えることができることを確認してください。そうしないと、すべての時間に無駄な時間がかかります。 –

答えて

1

出発点としてお試しください。

XSLT 1.0

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

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@value"> 
    <xsl:variable name="code" select="translate(../@name, '123456789', '000000000')" /> 
    <xsl:attribute name="value"> 
     <xsl:choose> 
      <xsl:when test="$code='B0F'">Test Borrower</xsl:when> 
      <xsl:when test="$code='B0L'">Last Name</xsl:when> 
      <!-- add more here --> 
     </xsl:choose> 
    </xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 
+0

これは私のためには機能しません。私はこれを私のxslに追加しても同じ結果を得ました...並べ替えられましたが、置き換えられません。 – mike

+0

あなたのしたことは私には分かりません。あなたは私のバージョンがここで働いているのを見ることができます:http://xsltransform.net/bFWR5ERとAFAICS結果は期待した結果と同じです。 –

+0

を使用すると、指定されたB0FおよびB0L以外のすべてのデータがクリアされます。これは望ましくない。また、結果のデータをソートしようとしていますが、これは起こっていません。 – mike

関連する問題