XSLT 2.0:选择子范围的节点。怎么样?

时间:2014-05-18 10:54:05

标签: xml xslt-2.0

我在index.xml中有这个,我使用XSLT 2.0进行转换:

<numberGroup>
  <entry>
    <file>n1.xml</file>
  </entry>
  <entry>
    <file>n2.xml</file>
  </entry>
  <entry>
    <file>n3.xml</file>
  </entry>
  ..... many more entries
</numberGroup>
... and more numberGoups

在样式表中,我有两个模板:

<xsl:template match="numberGroup">
<xsl:apply-templates select="entry">
  <xsl:with-param name="ngFiles" select="entry/file" tunnel="yes"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="entry">
   <xsl:param name="ngFiles" required="yes" tunnel="yes"/>
   ....
</xsl:template>

现在,选择=&#34;条目/文件&#34;每次为&#34;条目/文件&#34;执行第二个模板时,选择所有文件n1,n2,n3。 但是,我只需要选择包含&#34;条目/文件&#34;的文件。在我调用模板的文件之前。因此,当第二个模板为n1.xml执行时,ngFiles为空,当它为n2.xml执行时,ngFiles只有n1,当模板为n3.xml执行时,ngFiles只有n1和n2。 我想也许我可以做类似的事情:

<xsl:with-param name="ngFiles" select="entry/file[0 to .....]" tunnel="yes"/>

在第一个模板中。 对......的任何建议? 也许是前面的::文件左右的东西?

1 个答案:

答案 0 :(得分:1)

您可以使用

match="entry"模板中检索所需的节点,而不是传递参数
preceding-sibling::entry/file

如果要将此值传递到其他模板,请执行以下操作:

<xsl:template match="numberGroup">
  <xsl:apply-templates select="entry"/>
</xsl:template>

<xsl:template match="entry">
  <xsl:param name="ngFiles" select="preceding-sibling::entry/file" tunnel="yes"/>
   ....
</xsl:template>

select上的xsl:param在包含它的模板的上下文中进行评估(即entry元素是当前上下文项)而selectwith-param在调用者的上下文中进行评估。