2012-05-14 76 views
1

我有一個看起來像這樣使用XML使用XSLT

<parent> 
     <child id="123456">Child Name 
     </child> 
     <image name="child.jpg"> 
</parent> 

源XML屬性值在結果XML兩種不同的元素目標XML應該是

<data> 
    <person id="123456"> 
     <name>Child Name</name> 
    </person> 
    <relation id="123456"> 
     <filename>child.jpg</filename> 
    </relation> 
</data> 

我使用XSLT轉換這個。 的問題是,當我怎樣才能在使用XSLT在目標XML兩個不同的地方得到id的值(即123456)從源XML。

+0

使用'xsl:variable'。 –

+0

@dradu:在解決這個問題時沒有必要使用變量 - 請參閱我的答案。 –

回答

0

你可以試試這個: 的XSL:

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

<xsl:template match="/"> 
    <data> 
     <xsl:for-each select="parent"> 
      <!--variable to store @id--> 
      <xsl:variable name="id" select="child/@id"/> 
      <!--creating a test comment node()--> 
      <xsl:comment>Child having id: <xsl:value-of select="child/@id"/></xsl:comment> 
      <xsl:element name="person"> 
       <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute> 
       <xsl:element name="name"> 
        <xsl:value-of select="./child/text()"/> 
       </xsl:element> 
      </xsl:element> 
      <xsl:element name="relation"> 
       <xsl:attribute name="id"> 
        <xsl:value-of select="$id"/> 
       </xsl:attribute> 
       <xsl:element name="filename"> 
        <xsl:value-of select="./image/@name"/> 
       </xsl:element> 
      </xsl:element> 
     </xsl:for-each> 
    </data> 
</xsl:template> 

</xsl:stylesheet> 

輸入XML(你的,但略作修改,使之很好*形成)

<?xml version="1.0"?> 
<parent> 
     <child id="123456">Child Name</child> 
     <image name="child.jpg"/> 
</parent> 

而結果

<?xml version='1.0' ?> 
<data> 
    <!--Child having id: 123456--> 
    <person id="123456"> 
    <name>Child Name</name> 
    </person> 
    <relation id="123456"> 
    <filename>child.jpg</filename> 
    </relation> 
</data> 
+1

小心 - 雖然這個答案適用於OP的問題,但可能並不像@Dimitre Novatchev提出的那樣全面。舉例來說,如果他們兩個'/'一個''元素的內部元素對,你將只返回第一個。再次,這不是OP明確要求的場景,但值得一看。 – ABach

2

下面是一個簡短和簡單的解決方案

<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="parent"> 
    <data> 
     <xsl:apply-templates/> 
    </data> 
</xsl:template> 

<xsl:template match="child"> 
    <person id="{@id}"> 
    <name><xsl:value-of select="."/></name> 
    </person> 
</xsl:template> 

<xsl:template match="image"> 
    <relation id="{preceding-sibling::child[1]/@id}"> 
    <filename><xsl:value-of select="@name"/></filename> 
    </relation> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔施加:

<parent> 
    <child id="123456">Child Name</child> 
    <image name="child.jpg"/> 
</parent> 

有用,正確的結果產生:

<data> 
    <person id="123456"> 
     <name>Child Name</name> 
    </person> 
    <relation id="123456"> 
     <filename>child.jpg</filename> 
    </relation> 
</data> 
+0

@Touseef:你舉的「簡單」什麼是不必要的複雜(沒有'的xsl:element'並沒有'的xsl:屬性」是必要的),低效的和潛在的越野車('祖先:: MainStory/@ kmsid'掃描所有祖先通常選擇多個節點)。 –

+0

感謝Dimitre,它幫助 –

+0

@Touseef:我很高興我的回答是對你有用。您能否請*接受*這個答案(通過點擊答案旁邊的複選標記)? –