首页 > 解决方案 > 使用 xslt 处理 xml 文档中任意位置的元素

问题描述

我有一个xml文件,它基本上是一篇文章的数据。我想使用xslt.

我的问题:如何在 xml 文档中的任何位置通过 xslt 处理元素?

我的研究使我找到了身份模板,但我使用它的尝试被证明是徒劳的。这是我尝试过的东西:

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

<xsl:template match="em">
blabla
</xsl:template>

但它并没有em用 blabla 替换内容。

我还发现,在任何地方验证元素都不可能与xsd模式有关。但我希望答案是不同的xslt

最小的工作示例:

<?xml version="1.0"?>
<doc>
    <foo>text <em>italics</em> anything</foo>
    <tag>text <foo><em>italics</em> stuff</foo></tag>
</doc>

例如,我想<em>foo</em><it>foo</it> or代替\emph{foo}(当然在文档上进行其他转换)。

标签: xmlxslt

解决方案


您的 XSLT 已按要求工作。

这是一个替换为的完整em示例it

中的 XML

<?xml version="1.0"?>
<doc>
    <foo>text <em>italics</em> anything</foo>
    <tag>text <foo><em>italics</em> stuff</foo></tag>
</doc>

XSLT

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

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

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

</xsl:stylesheet>

XML 输出

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <foo>text <it>italics</it> anything</foo>
    <tag>text <foo>
         <it>italics</it> stuff</foo>
   </tag>
</doc>

推荐阅读