这里使用的position()是否可以在xslt 2.0中检索两个标签子集中具有相同位置的节点?

时间:2016-12-24 23:34:01

标签: xml qt xslt xslt-2.0

我有两个子集中定义的节点列表,如下所示:

<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}} $index23我每次都会获得正确的值。

但是,我无法使用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,而不是预期的递增位置。)

1 个答案:

答案 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>