0

我有一个包含预处理集 (DoesNotContainChildElement) 的 xsl:variable。我认为 msxsl:node-set() 正在添加一个根元素,因此位置始终为 1。但我需要前 15 个元素。

<xsl:variable name="Summary">
<xsl:for-each select="msxsl:node-set($DoesNotContainChildElement)">
  <xsl:if test="position() &lt; 16">
    <xsl:copy-of select="."></xsl:copy-of>
  </xsl:if>
</xsl:for-each>

4

3 回答 3

3

不,该函数msxsl:node-set不添加任何根节点,只是使用 XSLT 1.0 的示例

<xsl:variable name="rtf1">
  <item>1</item>
  <item>2</item>
  <item>3</item>
</xsl:variable>

创建一个结果树片段,并且“结果树片段被等同于仅包含一个根节点的节点集”。因此,在上面的示例中,我们有一个带有单个根节点的结果树片段,其中包含三个item子元素。

应用msxsl:node-set(rtf1)扩展函数然后给你一个而不是结果树片段,现在节点集包含一个带有三个子元素node-set的根节点。item因此,如果您想访问item您需要msxsl:node-set($rtf1)/*或更一般msxsl:node-set($rtf1)/node()地访问所有子节点的元素。

于 2012-04-07T10:24:30.500 回答
1

只有一个变量 $DoesNotContainChildElement,因此 for-each 只会为 position() 产生值 1。
您可以通过运行以下命令来检查:

<xsl:for-each select="$x">
    <pos1><xsl:value-of select="position()"/></pos1>
</xsl:for-each>
<xsl:for-each select="$x/*">
    <pos2><xsl:value-of select="position()"/></pos2>
</xsl:for-each>

其中 x 是一个(节点集类型)变量。
结果看起来像

<pos1>1</pos1>
<pos2>1</pos2>
<pos2>2</pos2>
<pos2>3</pos2>
<pos2>...</pos2>

在上述第一个 for-each 的情况下,添加<xsl:copy-of select="."/>将导致整个变量内容的输出,而对于第二个 for-each,它将导致变量的每个子元素的输出一个接一个。
如果您希望仅输出选定的子元素,则可以使用第二种形式。当您首次应用节点集函数将 rtf 更改为节点集时也是如此。

于 2012-04-07T07:37:43.470 回答
1
于 2012-04-07T01:25:03.617 回答