2013-05-15 45 views
4

我無法弄清楚如何從XML文檔訪問標籤中的所有屬性。使用XSLT從XML檢索所有屬性值

比方說,我有以下XML:

<names> 
    <name firstname="Rocky" lastname="Balboa" divider=", "/> 
    <name firstname="Ivan" lastname="Drago" divider=", "/> 
</names> 

我想下面的輸出: Rocky Balboa, Ivan Drago,

我現在擁有的是:

<xsl:for-each select="names/name"> 
    <xsl:value-of select="@firstname"/> 
    <xsl:value-of select="@lastname"/> 
    <xsl:value-of select="@divider"/> 
</xsl:for-each> 

什麼我不知道是如果可以只用一個選擇值來做到這一點,而不必做三個選擇。因此,爲了澄清,我希望能夠通過一個select-select值來輸出標籤中的所有屬性。這可能嗎?

謝謝。

+0

您可以使用此的XPath @ *獲得所有屬性,如:
user1188611

+0

please考慮fromatting。由於奇怪的原因格式不能在我的最後。 – user1188611

+0

好吧我想你也可以這樣做。但我想弄清楚如何以我的方式做到這一點,但只有一個選擇的值。 –

回答

-1

您可以使用此的XPath @ *獲得所有屬性,例如:

<xsl:template match="/*"> 
    <xsl:for-each select="@*"> 
     <xsl:value-of select="concat(name(), ': ', ., ' ')"/> 
    </xsl:for-each> 
</xsl:template> 

這將讓你只使用一個價值的選擇,以得到你想要的輸出。它會考慮到所有的屬性。

這應該是一個足夠的暗示讓你找出事情。如果您有任何其他問題,請告訴我。

+0

與請求沒有多大關係。你正在產生一些像'firstname:Ivan lastname:...'(如果有的話)。但要求是:'岩石巴波亞,伊萬德拉戈,' –

3

因爲我不確定xsl:value-of的使用是否是一個困難的要求,或許下面的內容可能就是您要鎖定的內容。

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

    <xsl:template match="name" mode ="print" > 
     <xsl:value-of select="@firstname"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="@lastname"/> 
     <xsl:value-of select="@divider"/> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="names/name" mode="print"/> 
    </xsl:template> 

</xsl:stylesheet> 

你可以在任何位置使用<xsl:apply-templates select="names/name" mode="print"/> 您已經考慮如何使用一個行值的所有屬性。
上面的模板會生成以下的輸出:

Rocky Balboa, Ivan Drago, 

更新箱輸出,而無需使用屬性名稱:

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

    <xsl:template match="name" mode ="print" > 
     <xsl:for-each select="@*" > 
      <xsl:if test="not(position() = last() or position() = 1)"> 
       <xsl:text> </xsl:text> 
      </xsl:if> 
      <xsl:value-of select="."/> 

     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="names/name" mode="print"/> 
    </xsl:template> 

</xsl:stylesheet> 
0

如果你可以使用XSLT 2.0,你可以這樣做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="text()"/> 

    <xsl:template match="*[@*]"> 
     <xsl:value-of select="@*[not(name()='divider')]" separator=" "/> 
     <xsl:value-of select="@divider"/>   
     <xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

這將輸出所有屬性,您無法控制訂單,所以如果要指定一個訂單,你可以使用一個序列:

<xsl:value-of select="(@firstname,@lastname)" separator=" "/> 

或做一個xsl:apply-templatesxsl:sortname()(或其他)的屬性進行排序。讓我知道你是否想要一個例子。

+0

我必須解釋自己錯了。我想知道是否可以打印出所有的屬性,而不是調用屬性的名稱。類似於選擇「*」或沿着這些線條的值。 –

+0

@ErikÅstrand - 這就是''除了忽略'divider'屬性外。你也可以用'',但不能保證'divider'是最後一個輸出。 –

0

在XSLT 2.0以下工作:

<xsl:for-each select="names/name"> 
    <xsl:value-of select="@firstname, @lastname, @divider"/> 
</xsl:for-each> 

和3。0你可以這樣做:

<xsl:value-of select="names/name!(@firstname, @lastname, @divider)"/> 

雖然你可能需要作出調整,以獲得你想要的空白。

+0

嘿。謝謝回覆。我並不想知道如何通過調用屬性的名稱來打印出一行中的所有屬性。我正在尋找一種方法來簡單地調用所有的屬性,而不管名稱如何。沿着這些線的東西:值 - 的選擇=「*」。可以打印所有屬性的東西,但不能單獨調用它們。 –

+0

那麼,這只是'@ *'。 –

1

嘗試以下操作:

<xsl:template match="/"> 
<xsl:for-each select="names/name/@*"> 
     <xsl:value-of select="concat(., ' ')"/> 
    </xsl:for-each> 
</xsl:template>