2017-10-08 64 views
0

我有下面的XML:XSLT獲取值基於其他元素的值

<data> 
     <name>att1</name> 
     <value>BLUE</value> 
    </data> 
    <data> 
     <name>id</name> 
     <value>5864828</value> 
    </data> 
    <data> 
     <name>att2</name> 
     <value>XL</value> 
    </data> 
    <data> 
     <name>status</name> 
     <value>In-Stock</value> 
    </data> 

,我需要將其轉換爲:

<product> 
    <id>5864828</id> 
    <color>BLUE</color> 
    <size>XL</size> 
    <avail>In-Stock</avail> 
</product> 

我發現以下問題: Concatenate XSLT element values based on another element value 但是在該線程中,提供的解決方案在更改屬性名稱時使用「xsl-if」,並且不關心更改數據顯示順序。

所以我的問題在這裏,有沒有一種方法,我不必使用xsl-if,並且實際上可以改變屬性的順序?

+1

「有沒有一種方法可以讓我不必使用xsl-if,並且實際上可以改變屬性的順序?」。這是令人困惑的。您的輸入XML和所需的輸出都不包含任何屬性。而輸入沒有根元素。 – mzjn

+0

@mzjn對不起,混淆,屬性是指產品屬性(顏色,大小等)。 – minus

回答

0

希望的輸出可以通過組合選擇匹配模板的順序和(而不是如果xsl-ifxsl-choose來創建元素來實現。

我發明了一個任意的<root>元素來補償你的示例xml中缺少的元素。

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

    <!-- always start out matching the document root --> 
    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <!-- match the root element (not shown in your example) --> 
    <xsl:template match="root"> 
     <xsl:element name="product"> 
      <!-- apply templates in the desired order, specifically selecting matching 'data' elements --> 
      <xsl:apply-templates select="data[name/text() = 'id']" /> 
      <xsl:apply-templates select="data[name/text() = 'att1']" /> 
      <xsl:apply-templates select="data[name/text() = 'att2']" /> 
      <xsl:apply-templates select="data[name/text() = 'status']" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="data"> 
     <!-- choose the desired output element based on the current data/name text --> 
     <xsl:choose> 
      <xsl:when test="./name[text() = 'id']"> 
       <xsl:element name="id"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:when test="./name[text() = 'att1']"> 
       <xsl:element name="color"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:when test="./name[text() = 'att2']"> 
       <xsl:element name="size"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:when test="./name[text() = 'status']"> 
      <xsl:element name="avail"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:otherwise /> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

有關XSLT最常見的誤解是試圖xsl-foreach - 使用匹配模板是要走的路,但它可以是很難表達所需的XPath來獲得所需的條件。