即使它不完全清楚你的期望,我會嘗試一個答案。
正如我理解你喜歡找到與<e>
元素具有相同位置的<d>
元素。
這可能是將當前位置作爲變量獲取的。
的
preceding-sibling
<xsl:value-of select="//b/d[(count(current()/preceding-sibling::*)+1)]/@id" />
更新下面的部分
xsl:variable name ="pos" select="position()" />
<xsl:value-of select="//b/d[position() = $pos]/@id" />
或使用次數是因爲從「全能喬治」的評論而改變。
請注意position()
的結果取決於調用上下文。
例如以下測試XSLT(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="/">
<Lessons>
<!-- Wrong result with position -->
<xsl:for-each select="//c/e">
<xsl:call-template name="lesson" />
</xsl:for-each>
</Lessons>
<Lessons2>
<!-- Wonted result even with position -->
<xsl:for-each select="//c">
<xsl:for-each select="e">
<xsl:call-template name="lesson" />
</xsl:for-each>
</xsl:for-each>
</Lessons2>
</xsl:template>
<xsl:template name="lesson">
<Lesson>
<Teacher>
<xsl:value-of select="@id" />
<xsl:text>,</xsl:text>
<xsl:value-of select="count(./preceding-sibling::*)+1" />
<xsl:text>,</xsl:text>
<xsl:variable name ="pos" select="position()" />
<xsl:value-of select="$pos" />
<xsl:text>,</xsl:text>
<xsl:value-of select="//b/d[position() = $pos]/@id" />
<xsl:text>,</xsl:text>
<xsl:value-of select="//b/d[count(current()/preceding-sibling::*)+1]/@id" />
</Teacher>
</Lesson>
</xsl:template>
</xsl:stylesheet>
利用該輸入:
<?xml version="1.0" encoding="utf-16"?>
<xml>
<a>
<b>
<d id="d1"/>
<d id="d2"/>
<d id="d3"/>
</b>
<c>
<e id="e1"/>
<e id="e2"/>
<e id="e3"/>
</c>
<c>
<e id="e21"/>
<e id="e22"/>
<e id="e23"/>
</c>
<c>
<e id="e21"/>
<e id="e22"/>
<e id="e23"/>
</c>
</a>
</xml>
生成此輸出:
<Lessons>
<Lesson>
<Teacher>e1,1,1,d1,d1</Teacher>
</Lesson>
<Lesson>
<Teacher>e2,2,2,d2,d2</Teacher>
</Lesson>
<Lesson>
<Teacher>e3,3,3,d3,d3</Teacher>
</Lesson>
<Lesson>
<Teacher>e21,1,4,,d1</Teacher>
</Lesson>
<Lesson>
<Teacher>e22,2,5,,d2</Teacher>
</Lesson>
<Lesson>
<Teacher>e23,3,6,,d3</Teacher>
</Lesson>
<Lesson>
<Teacher>e21,1,7,,d1</Teacher>
</Lesson>
<Lesson>
<Teacher>e22,2,8,,d2</Teacher>
</Lesson>
<Lesson>
<Teacher>e23,3,9,,d3</Teacher>
</Lesson>
</Lessons><Lessons2>
<Lesson>
<Teacher>e1,1,1,d1,d1</Teacher>
</Lesson>
<Lesson>
<Teacher>e2,2,2,d2,d2</Teacher>
</Lesson>
<Lesson>
<Teacher>e3,3,3,d3,d3</Teacher>
</Lesson>
<Lesson>
<Teacher>e21,1,1,d1,d1</Teacher>
</Lesson>
<Lesson>
<Teacher>e22,2,2,d2,d2</Teacher>
</Lesson>
<Lesson>
<Teacher>e23,3,3,d3,d3</Teacher>
</Lesson>
<Lesson>
<Teacher>e21,1,1,d1,d1</Teacher>
</Lesson>
<Lesson>
<Teacher>e22,2,2,d2,d2</Teacher>
</Lesson>
<Lesson>
<Teacher>e23,3,3,d3,d3</Teacher>
</Lesson>
</Lessons2>
使用位置()適用於這個例子,但是對於更加擴展的情況,position()獲得了點頭的值e在rtf而不是原始文檔中,因此如果存在多個c元素,則會發生故障 – 2013-04-25 08:09:44
但是, 做的伎倆。爲了澄清其他用戶,重要的因素是將count()函數放在()中 - 這樣函數的值就以數字形式返回,而不是作爲函數返回。如果它作爲函數返回,則會被忽略,結果返回d []的值 - 解釋我第一次得到的多個值。 –
2013-04-25 08:13:03
很高興我能幫到你。 (即使我第一次沒有正確閱讀請求;對此感到抱歉)。但我認爲你的解釋是不正確的。不是括號「()」是「竅門」(也應該在沒有它們的情況下工作)。無效的是使用'current()'而不是dot「。」('[count(./ preceding-sibling :: * )+1]')應該這樣做。 – 2013-04-25 08:42:11