3

我一直在尝试将简单的 xsl 样式应用于 xml 文档:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <html>
      <body>

        <xsl:for-each select="//title">
          <h1><xsl:value-of select="."/></h1>
        </xsl:for-each>

      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

不幸的是,这似乎只是简单地忽略了所有其他标签并将它们以及它们的内容从输出中删除,而我只剩下转换为 h1s 的标题。我想做的是保留我的文档结构,同时只替换它的一些标签。

例如,如果我有这个文件:

<section>
  <title>Hello world</title>
  <p>Hello!</p>
</section>

我可以得到这个:

<section>
  <h1>Hello world</h1>
  <p>Hello!</p>
</section>

不太确定从 XSLT 手册的哪个位置开始查找。

4

2 回答 2

7

正如 OR Mapper 所说,解决方案是在您的转换中添加一个标识模板,然后覆盖您需要的部分。这将是完整的解决方案:

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

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

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

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

在您的示例输入上运行时,这会产生:

<html>
  <body>
    <section>
      <h1>Hello world</h1>
      <p>Hello!</p>
    </section>
  </body>
</html>

如果您真的只想保留原始 XML 但替换<title>,您可以删除中间<xsl:template>,您应该得到结果:

<section>
  <h1>Hello world</h1>
  <p>Hello!</p>
</section>
于 2013-02-02T15:18:25.507 回答
2

您只想替换<title>元素。但是,在您的 XSLT 中,您为文档的根元素 ( /) 定义了一个模板,并将整个根元素替换为您的模板的内容。

真正想要做的是定义一个身份转换模板(谷歌这个,它是 XSLT 中的一个重要概念)基本上从你的源文档中复制所有内容,以及一个匹配你的<title>元素并用你的新代码替换它们的模板,像这样:

<xsl:template match="title">
    <h1><xsl:value-of select="."/></h1>
</xsl:template>
于 2013-02-02T13:48:00.973 回答