代码之家  ›  专栏  ›  技术社区  ›  GSerg

XPath:选择由<xsl:include>

  •  0
  • GSerg  · 技术社区  · 16 年前

    有一个XSL包含另一个XSL:

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

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

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

    文件上说,“孩子们 <xsl:stylesheet> 此文档中的元素替换包含文档中的元素”,因此我认为,鉴于include指令已起作用,我可以选择g:registered节点,就像它们始终属于包含文档一样:

    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 回复  |  直到 16 年前
        1
  •  0
  •   Community Mohan Dere    9 年前

    在变量中选择 模板名称 转换源文档

    编辑

    我不太确定。但是看起来您想要根据属性值创建一个元素。 那么这个 post will 你会感兴趣的。

    <xsl:for-each select="WorkItem">
        <xsl:element name="{Type}" >
            <xsl:value-of select="current()/@name"/>
        </xsl:element>
    </xsl:for-each>
    
        2
  •  0
  •   GSerg    16 年前

    这个 document('') 函数无论如何都会打开文件,因此它在性能方面没有任何优势 document('registered.xsl') . 既然它质疑 文件 ,而不是当前文档现在修改的DOM模型,结果不包括my includes。

    就我而言,不可能查询转换模板本身的DOM模型。