XPath:选择<xsl:include> </xsl:include>包含的节点

时间:2010-01-14 21:24:00

标签: xslt xpath

有一个XSL包含另一个XSL:

<xsl:include href="registered.xsl"/>

包含文件有一个节点列表:

<g:registered>
  <node1/>
  <node2/>
</g:registered>

文档说“本文档中<xsl:stylesheet>元素的子元素替换了包含文档中的元素”,所以我认为,鉴于include指令有效,我可以选择g:注册节点之类的如果他们总是属于包含文件:

select="document('')/xsi:schema/g:registered"

虽然返回了一个空的节点集。

但是,这个:

select="document('registered.xsl')/xsi:schema/g:registered"

确实选择了所需的内容,但是,正如我想的那样,这意味着第二次打开包含的文件,这对我来说似乎不太好。

那么如何在不打开第二次文件的情况下选择那些包含?

修改

请求的文件结构: 包含的文件:

<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns">

<g:registered-templates>
  <SampleTemplate/>
  <WrongTemplate/>
</g:registered-templates>

<xsl:include href="Sample Template.xsl" />
<xsl:include href="Wrong Template.xsl" />

</xsl:stylesheet>

包括文件:

<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:g="http://www.sample.com/ns">

<xsl:output method="text"/>

<xsl:include href="Label Registration.xsl"/>

<!-- How do I refer to just loaded inclusion without directing engine to the file again? -->
<xsl:variable name="template-names" select="document('Label Registration.xsl')/xsl:stylesheet/g:registered-templates"/>

<xsl:template match="Job">
  <xsl:for-each select="WorkItem">
    <xsl:apply-templates select="$template-names/*[local-name()=current()/@name]">
      <xsl:with-param name="context" select="." />
    </xsl:apply-templates>
  </xsl:for-each>
</xsl:template>


</xsl:stylesheet>

2 个答案:

答案 0 :(得分:0)

选择变量 模板名称 会查询转换源文档 - 而不是您包含的样式表。 如果要引用g:registered-templates,则必须像第二个源文档一样指向该文件。

修改

我不太确定。但看起来你想根据属性值创建一个元素。 在这种情况下,post will对你来说很有意思。

<xsl:for-each select="WorkItem">
    <xsl:element name="{Type}" >
        <xsl:value-of select="current()/@name"/>
    </xsl:element>
</xsl:for-each>

答案 1 :(得分:0)

好的,我的理解是错误的。

document('')函数无论如何都会打开文件,因此它在性能方面优于document('registered.xsl')。由于它查询文件,而不是当前文档的现在修改的DOM模型,因此结果不包括我的包含。

就我而言,无法查询转换模板本身的DOM模型。