使用xslt处理xml文档中任何位置的元素

时间:2018-06-02 16:51:04

标签: xml xslt

我有一个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>

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

我还发现在任何地方验证元素都不可能与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>\emph{foo}(当然还要对文档进行其他转换)。

2 个答案:

答案 0 :(得分:1)

您的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 out

<?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>

答案 1 :(得分:0)

你没有解释你所尝试的解决方案在什么方面并不是你想要的,但听起来你的想法是正确的。您可以修改身份模板以删除<copy>语句,然后它将深入遍历所有元素,将任何所需元素与特定模板匹配。如果这不是您想要的,请在您的问题中更具体。