我有一个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}
(当然还要对文档进行其他转换)。
答案 0 :(得分:1)
您的XSLT已按要求运行。
以下是将em
替换为it
的完整示例:
<?xml version="1.0"?>
<doc>
<foo>text <em>italics</em> anything</foo>
<tag>text <foo><em>italics</em> stuff</foo></tag>
</doc>
<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 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>
语句,然后它将深入遍历所有元素,将任何所需元素与特定模板匹配。如果这不是您想要的,请在您的问题中更具体。