2016-12-18 10 views
0

(Line 1、Line2)にない値を持つすべての要素のリストを取得しようとしていて、それらをテストと同様のタグに挿入しようとしています。XMLタグ内の要素のリストを挿入します

今はすべての要素を取得できますが、これを自分の希望する値に制限するのに問題があります。そして、私はどのようにしてマッチ基準外の要素にマッチして行うのか不明です。どんなアドバイスも大歓迎です!

には、以下のXMLを考える:取得要素

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/>  
     <xsl:template match="node()"> 
     <xsl:for-each select="node()[text() != '']"> 
      <xsl:value-of select="local-name()"/> 
      <xsl:text>&#xA;</xsl:text> 
     </xsl:for-each> 
     <xsl:apply-templates select="node()"/> 
    </xsl:template> 

</xsl:stylesheet> 

ため

<?xml version="1.0" encoding="UTF-8"?> 
<Request> 
    <Header> 
     <Line1>Element1</Line1> 
     <Line2>Element2</Line2> 
    </Header> 
    <ElementControl> 
     <Update> 
      <Element>test</Element> 
     </Update> 
    </ElementControl> 
    <Member> 
     <Identifier>123456789</Identifier> 
     <Contact> 
      <Person> 
       <Gender>MALE</Gender> 
       <Title>Mr</Title> 
       <Name>JOHN DOE</Name> 
      </Person> 
      <HomePhone/> 
      <eMailAddress/> 
      <ContactAddresses> 
       <Address> 
        <AddressType>POS</AddressType> 
        <Line1>100 Fake Street</Line1> 
        <Line2/> 
        <Line3/> 
        <Line4/> 
        <Suburb>Jupiter</Suburb> 
        <State>OTH</State> 
        <PostCode>9999</PostCode> 
        <Country>AUS</Country> 
       </Address> 
      </ContactAddresses> 
     </Contact> 
    </Member> 
</Request> 

現在のXSLを結果XMLタグを挿入するための私のWIPのXMLは以下の通りです。それだけであるので、私は、mode属性を使用するには、現在のテンプレートを変更します

<?xml version="1.0" encoding="UTF-8"?> 
<Request> 
    <Header> 
     <Line1>Element1</Line1> 
     <Line2>Element2</Line2> 
    </Header> 
    <ElementControl> 
     <Update> 
      <Element>Identifier</Element> 
      <Element>Gender</Element> 
      <Element>Title</Element> 
      <Element>Name</Element> 
      <Element>AddressType</Element> 
      <Element>Line1</Element> 
      <Element>Suburb</Element> 
      <Element>State</Element> 
      <Element>PostCode</Element> 
      <Element>Country</Element> 
     </Update> 
    </ElementControl> 
    <Member> 
     <Identifier>123456789</Identifier> 
     <Contact> 
      <Person> 
       <Gender>MALE</Gender> 
       <Title>Mr</Title> 
       <Name>JOHN DOE</Name> 
      </Person> 
      <HomePhone/> 
      <eMailAddress/> 
      <ContactAddresses> 
       <Address> 
        <AddressType>POS</AddressType> 
        <Line1>100 Fake Street</Line1> 
        <Line2/> 
        <Line3/> 
        <Line4/> 
        <Suburb>Jupiter</Suburb> 
        <State>OTH</State> 
        <PostCode>9999</PostCode> 
        <Country>AUS</Country> 
       </Address> 
      </ContactAddresses> 
     </Contact> 
    </Member> 
</Request> 

答えて

0

:私は、

<xsl:template match="Element"> 
    <xsl:copy-of select="."/> 
    <Element>Value1</Element> 
</xsl:template> 

そして究極の所望の出力このに上記のxslの結果を挿入する方法がわかりませんよすべての要素を照合するのではなく、特定の場合に使用されます。またそうのような、出力要素ではなく、テキストにそれを変更する必要があります。

<xsl:template match="node()" mode="copy"> 
    <xsl:for-each select=".//node()[text() != '']"> 
     <Element> 
      <xsl:value-of select="local-name()"/> 
     </Element> 
    </xsl:for-each> 
</xsl:template> 

次にあなたが

<xsl:template match="ElementControl/Update"> 
     <xsl:apply-templates select="../../Member" mode="copy" /> 
    </xsl:template> 

は、このXSLTを試してみてください....このようにそれを呼び出すことができます。アイデンティティテンプレートを使用して既存の他のすべての要素をそのままコピーすることに注意してください。

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

    <xsl:strip-space elements="*"/>  

    <xsl:template match="node()" mode="copy"> 
     <xsl:for-each select=".//node()[text() != '']"> 
      <Element> 
       <xsl:value-of select="local-name()"/> 
      </Element> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="ElementControl/Update"> 
     <xsl:apply-templates select="../../Member" mode="copy" /> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題