2013-11-27 32 views
1

我有以下XML:靶向屬性在XSL轉換

<Head> 
    <Group1> 
     <Ref> 
      <RefType>ABC123</RefType> 
      <RefIdentifier>123456789</RefIdentifier> 
      <RefDate>2013-11-30</RefDate> 
     </Ref> 
    </Group1> 
    <Group2> 
     <UOM> 
      <UOMType>XYZ789</UOMType> 
      <UOMIdentifier>BlahBlah</UOMIdentifier> 
     </UOM> 
    </Group2> 
    <Group3> 
     <Rec> 
      <RecType>XYZ789</RecType> 
      <RecIdentifier>HalbHalb</RecIdentifier> 
     </Rec> 
    </Group3> 
</Head> 

,我需要轉換爲:

<Head> 
    <Ref> 
     <Identifier type="ABC123">123456789</Identifier> 
     <RefDate>2013-11-30</RefDate> 
    </Ref> 
    <UOM> 
     <Identifier type="XYZ789">BlahBlah</Identifier> 
    </UOM> 
    <Rec> 
     <Identifier type="XYZ789">HalbHalb</Identifier> 
    </Rec> 
</Head> 

使用XSLT。到目前爲止,我有以下幾點:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="/Head"/> 
    </xsl:template> 



    <xsl:template match="Head"> 
     <Head> 
      <xsl:for-each select="Group1/Ref"> 
       <Ref> 
        <Identifier><xsl:value-of select="RefIdentifier"/></Identifier> 
        <RefDate><xsl:value-of select="RefDate"/></RefDate> 
       </Ref> 
      </xsl:for-each> 
      <xsl:for-each select="Group2/UOM"> 
       <UOM> 
        <Identifier><xsl:value-of select="UOMIdentifier"/></Identifier> 
       </UOM> 
      </xsl:for-each> 
      <xsl:for-each select="Group3/Rec"> 
       <Rec> 
        <Identifier><xsl:value-of select="RecIdentifier"/></Identifier> 
       </Rec> 
      </xsl:for-each> 
     </Head> 
    </xsl:template> 

</xsl:stylesheet> 

這給了我

<Head> 
    <Ref> 
     <Identifier>123456789</Identifier> 
     <RefDate>2013-11-30</RefDate> 
    </Ref> 
    <UOM> 
     <Identifier>BlahBlah</Identifier> 
    </UOM> 
    <Rec> 
     <Identifier>HalbHalb</Identifier> 
    </Rec> 
</Head> 

,但我不知道如何在「標識」標籤的「類型」屬性,其價值爲參考,UOM和Rec標籤。我怎樣才能做到這一點?

+0

看起來您的標題不正確:您正嘗試使用XSLT轉換XML而不是XSL。此外,標題應該更加具體:使用XSLT轉換XML是一個整體類型的問題。 – LarsH

+0

P.S.歡迎來到stackoverflow。 :-) – LarsH

回答

0

但我不知道如何獲得Ref,UOM和Rec標記的 '標識符'標記中的'type'屬性及其值。我怎樣才能做到這一點?

用途:

<Identifier type="{RefType}"><xsl:value-of select="RefIdentifier"/></Identifier> 

花括號屬性值模板,它可以讓你裏面替換他們的XPath表達式的值。它們只允許在XSLT樣式表中的某些屬性值中使用,但是在文字結果元素中使用它們是一個常見的地方。

供參考:Ref,UOMRec不是「標籤」,而是元素。它們使用開始和結束標記進行序列化,但XSLT不對標記進行操作;它對元素進行操作。從標籤的角度思考和談論它們就像是說「我欠Steve的手5美元」而不是「我欠Steve 5美元」。我並不想迂腐,但將XML看作節點樹,其中每個元素是單個節點而不是兩個單獨的標記,這將有助於您更好地理解樣式表的工作原理。 XSLT將樹轉換爲另一個樹,並且僅在樣式表完成後纔會對標記進行序列化;有時XSLT甚至不能控制序列化。

+0

P.S. Bob使用''的方法也是有效的。但是,如果您已爲''而不是''使用文字結果元素,則通常沒有理由使用更詳細的'而不是文字結果屬性。 – LarsH

0

使用attribute標籤:

<Identifier> 
    <xsl:attribute name="type"><xsl:value-of select="RefType"/></xsl:attribute> 
    <xsl:value-of select="RefIdentifier"/> 
</Identifier> 

這種嵌入式作爲屬性。