我有两个子集中定义的节点列表,如下所示:
<top>
<left>
<name>One</value>
<name>Two</value>
<name>Three</value>
<name>Four</value>
</left>
<right>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</right>
</top>
我想转换左侧名称和右侧值的那些:
<division>
<name>One</name><value>1</value>
</division>
<division>
<name>Two</name><value>2</value>
</division>
<division>
<name>Three</name><value>3</value>
</division>
<division>
<name>Four</name><value>4</value>
</division>
到目前为止我想出的是以下内容。我遍历名称并尝试使用索引选择相应的值。
<xsl:for-each select="top/left/name/node()">
<division>
<xsl:copy-of select="."/> <!-- this works just fine -->
<!-- get position of <name> tag -->
<xsl:variable name="index"><xsl:value-of select="position()"/></xsl:variable>
<xsl:copy-of select="../../right/value/node[position() = $index]"/>
</division>
</xsl:for-each>
如果我在$index
中将1
替换为node[position() == $index]
,那么我会得到正确的值(但显然它总是"1"
。)同样,我可以设置{ {1}} $index
,2
或3
我每次都会获得正确的值。
但是,我无法使用4
变量获得正确的值,如上面的代码所示。
我认为这是$index
实施中的一个错误,但是我想确保你也会这样做?也许有另一种方式,这将允许我避免Qt错误?
以防万一,我尝试使用以下内容:
QtXmlPatterns
本身就在 <xsl:value-of select="position()"/>
定义之前或之后,它正如我所期望的那样向我展示1,2,3和4。然而,:
<xsl:variable ...
只显示第一个值(即看起来 <xsl:copy-of select="../../right/value/node[position() = $index]"/>
始终设置为值$index
,而不是预期的递增位置。)
答案 0 :(得分:1)
你为什么不这样试试呢?
<xsl:for-each select="top/left/name">
<division>
<xsl:copy-of select="."/>
<xsl:variable name="index" select="position()"/>
<xsl:copy-of select="../../right/value[$index]"/>
</division>
</xsl:for-each>
您的尝试失败主要是因为文本节点始终是其父value
元素中的第一个(也是唯一)节点。
请注意,这假定格式良好的XML:
<top>
<left>
<name>One</name>
<name>Two</name>
<name>Three</name>
<name>Four</name>
</left>
<right>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</right>
</top>