2
<root>
<tag>
  <form>
   some html form will be here
  </form>

</tag>
<tag>
  some visible data
</tag>

xslt

<xsl:template match="tag">
    <div id="page-base">
      <xsl:apply-templates />
    </div>
  </xsl:template>

生产

<div id="page-base">

</div>
<div id="page-base">
 some visible data
</div>

期望的输出

<div id="page-base">
 <form>
   some html form will be here
  </form>
</div>
<div id="page-base">
 some visible data
</div>

编辑:

如果tag嵌套在tag模板规则适用的元素中,它将用模板替换标签并复制模板不匹配的其他元素。请看例子。tag可以任意嵌套

<root>
        <tag>
          <form>
           some html form will be here
          </form>
          <tag>
            arbitrary nested tags
          </tag>    
        </tag>
        <tag>
          some visible data
        </tag>
</root>

预期结果

 <div id="page-base">
     <form>
       some html form will be here
      </form>
      <div id="page-base">
       arbitrary nested tags  
      </div>
  </div>
  <div id="page-base">
     some visible data
  </div>
4

2 回答 2

2

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="tag">
  <div id="page-base">
    <xsl:copy-of select="node()"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<root>
    <tag>
        <form>
   some html form will be here
        </form>
    </tag>
    <tag>
  some visible data
    </tag>
</root>

产生想要的正确结果:

<div id="page-base">
   <form>
   some html form will be here
        </form>
</div>
<div id="page-base">
  some visible data
    </div>

说明

您的代码缺少一些东西来复制匹配tag元素的主体。

这个“东西”就是xsl:copy-of指令。


更新

OP改变了他的问题,这需要不同的解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*"><xsl:apply-templates/></xsl:template>

 <xsl:template match="tag">
  <div id="page-base">
    <xsl:apply-templates/>
  </div>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于新提供的 XML 文档时:

<div id="page-base">
   <form>
           some html form will be here
          </form>
   <div id="page-base">
            arbitrary nested tags
          </div>
</div>
<div id="page-base">
          some visible data
        </div>
于 2012-09-13T14:05:13.287 回答
1

添加复制规则

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

这将简单地复制任何与更具描述性的模板不匹配的节点。由于匹配规则的包罗万象,其他规则将优先,除非您调整它们的优先级,在这种情况下,您应该为该规则分配比任何其他规则低的优先级。

如果您只想复制树的某些部分,则应为其添加单独的模式,您必须在调用应用该模板时指定该模式。

<xsl:template match="@*|node()" mode="copy">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" mode="copy"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="tag">
  <div id="page-base">
    <xsl:apply-templates mode="copy"/>
  </div>
</xsl:template>

如果您使用的是 XSLT 2.0,您还可以使用copy-of. 但上述方法仍然更加灵活,因为它允许您从副本中省略或转换某些节点。

于 2012-09-13T14:04:47.677 回答