2012-02-13 7 views
4

に基づいて、XMLタグに属性を追加し、私は次のXMLを変換しようと... XSLTのまわりで私の頭を包むのに苦労しています:つまりactiveFlagタグ値を取り出す(これに別のタグの値

<employees> 
    <employee> 
     <employeeNumber>1234</employeeNumber> 
     <startdate>01/02/2003</startdate> 
     <activeFlag>true</activeFlag> 
     <firstname>Erik</firstname> 
     <address> 
      <addressline1>123 Main</addressline1> 
      <zip>07016</zip> 
      <state>New Jersey</state> 
      <city>My City</city> 
     </address> 
    </employee> 
</employees> 

と代わりに従業員タグの属性に入れます)。

<employees> 
    <employee active="true"> 
      <employeeNumber>1234</employeeNumber> 
      <startdate>01/02/2003</startdate> 
      <firstname>Erik</firstname> 
      <address> 
       <addressline1>123 Main</addressline1> 
       <zip>07016</zip> 
       <state>New Jersey</state> 
       <city>My City</city> 
      </address> 
    </employee> 
</employees> 

私は、次のXSLTを試してみたが、それだけで何もしない:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="employees/employee">  
     <employee active="{activeFlag}"/> 
    </xsl:template> 

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

任意のアイデア?

答えて

3

この短い、簡単な(明示的な条件付き命令)変換:あなたはまた、このテンプレートを使用していたかもしれない

:提供されるXML文書に適用

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

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

<xsl:template match="employee"> 
    <employee active="{activeFlag}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </employee> 
</xsl:template> 

<xsl:template match="activeFlag"/> 
</xsl:stylesheet> 

<employees> <employee> <employeeNumber>1234</employeeNumber> <startdate>01/02/2003</startdate> <activeFlag>true</activeFlag> <firstname>Erik</firstname> <address> <addressline1>123 Main</addressline1> <zip>07016</zip> <state>New Jersey</state> <city>My City</city> </address> </employee> </employees> 

は、所望の正しい結果をもたらす

<employees> 
    <employee active="true"> 
    <employeeNumber>1234</employeeNumber> 
    <startdate>01/02/2003</startdate> 
    <firstname>Erik</firstname> 
    <address> 
     <addressline1>123 Main</addressline1> 
     <zip>07016</zip> 
     <state>New Jersey</state> 
     <city>My City</city> 
    </address> 
    </employee> 
</employees> 

説明identity ruleのオーバーライド、AVTの使用。

あなたは何activeFlag子が存在しない正しくケースを処理したい場合には、それはわずかに複雑になる:

<xsl:template match="employee"> 
    <employee active= 
    "{concat(activeFlag, 
      substring('false', 
         1 div not(activeFlag)) 
      ) 
     }"> 
    <xsl:apply-templates select="node()|@*"/> 
    </employee> 
</xsl:template> 
+0

OK - 感謝の両方そんなに...もう一つは申し訳ありません(質問をフォローアップOPに含まれないため)。このメソッドを使って、xmlns、xmlns:xsi、およびxsi:schemaLocation属性をemployeesタグに追加しようとしましたが、それがエラーになりました。これらの特別な属性ですか? –

+0

@ErikSorensen: 'xmlns ='は属性ではありません - これは名前空間宣言です。 namespace-uriが静的に認識されている場合は、名前空間宣言を作成する際に問題はありません.XSLT 1.0でない場合は、xxx:node-set()拡張を含むトリックを使用する必要があります。名前空間。 –

+0

@エリック・ソレンセン:私の答えはあなたにとって役に立ちました。それを受け入れることを検討してみませんか? –

3

このXSLT 1.0スタイルシート:あなたの例に適用

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

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

    <xsl:template match="employee"> 
    <xsl:copy> 
     <xsl:if test="activeFlag"> 
     <xsl:attribute name="active"><xsl:value-of select="activeFlag"/></xsl:attribute> 
     </xsl:if> 
     <xsl:apply-templates/>  
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="activeFlag"/> 

</xsl:stylesheet> 

は、XMLを生成します:あなたはactiveFlagが存在することを確信している場合は、あなたがいない場合

<employees> 
    <employee active="true"> 
     <employeeNumber>1234</employeeNumber> 
     <startdate>01/02/2003</startdate> 
     <firstname>Erik</firstname> 
     <address> 
     <addressline1>123 Main</addressline1> 
     <zip>07016</zip> 
     <state>New Jersey</state> 
     <city>My City</city> 
     </address> 
    </employee> 
</employees> 

をあなたはxsl:ifを削除することができます属性が存在するかどうかにかかわらず作成されるかどうかを注意してください。

また、スタイルシートが機能しない理由は、employees/employeeのテンプレートにテンプレートを適用していなかったためです。

<xsl:template match="employees/employee">  
    <employee active="{activeFlag}"> 
     <xsl:apply-templates/> 
    </employee> 
    </xsl:template> 
関連する問題