2013-12-12 97 views
1

我有以下XML節點:XSL for循環節點模式

<parent> 
    <child1name>value</child1name> 
    <child2name>value</child2name> 
    <child3name>value</child3name> 
    <child4name>value</child4name> 
    <others /> 
</parent> 

我要循環通過與文本格式[數字]文本名稱的每個節點。 所以我做:

<xsl:for-each select="parent/child*name"> 
    Value <xsl:value-of select="position()" />: <xsl:value-of select="." /> 
</xsl:for-each> 

但沒有奏效。

什麼是正確的模式? "child\d{1}name"也許?

回答

1

一個正確的模式將是

<xsl:for-each select="parent/*[starts-with(./name(),'child')]"> 

否則,如果您需要更嚴厲的限制:

<xsl:for-each select="parent/*[starts-with(./name(),'child') and ends-with(./name(),'name')]"> 

此外,這是不好的做法是加入文本在這樣的樣式表。相反,你可以附上xsl:text元素中的任何文字。

與輸入工作的整個樣式表段,您證明:

<?xml version="1.0" encoding="utf-8"?> 

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

<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:for-each select="parent/*[starts-with(./name(),'child') and ends-with(./name(),'name')]"> 
    <xsl:text>Value </xsl:text> 
    <xsl:value-of select="position()" /> 
    <xsl:text>: </xsl:text> 
    <xsl:value-of select="." /> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

這給出了以下的輸出:

Value 1: value 
Value 2: value 
Value 3: value 
Value 4: value 
+0

當部署它告訴我: ERROR: '' Sintax錯誤 '根/父/ * [開始-與(./名稱(),' 節點「)] – Wolfchamane

+0

它適用於XSLT 2.0和Saxon 9.1。你與什麼工作?另外,我沒有寫'starts-with(./ name(),'node')'。 –

+0

我知道,我知道 我正在使用1.0 它正確部署與「[開始(名稱(),'孩子')]」「,但沒有節點檢索,我測試了它與計數() – Wolfchamane

0

我會改變XML結構。對我來說更容易通過子元素,而不喜歡的圖案來運行:

<parent> 
    <childs> 
    <child> 
     <id>1</id> 
     <name>value</name> 
    </child> 
    <child> 
     <id>2</id> 
    <name>value</name> 
    </child> 
    <child> 
     <id>3</id> 
    <name>value</name> 
    </child> 
    <child> 
     <id>4</id> 
    <name>value</name> 
    </child> 
    </childs> 
    <others /> 
</parent> 

我認爲,結構更清晰,只是不同的充方式。

問候

+0

謝謝,但我無法更改XML結構。 – Wolfchamane