在整个XML中应用XSL转换

时间:2015-11-09 19:02:22

标签: xml xslt

因此,下面的XSL会将任何连字符转换为XML中Foo的空格。

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
</xsl:template>
<xsl:template match="Foo">
    <xsl:copy>
        <xsl:value-of select="translate( ., '-', ' ')" />
    </xsl:copy>
</xsl:template>

上述XSLT效果很好但仅适用于Foo。有没有办法让翻译适用于所有元素,而无需为每个元素单独设置(同时保持原始XML结构完整)?

1 个答案:

答案 0 :(得分:1)

在进行字符串处理时,正确的方法是使用<xsl:template match="text()"><xsl:value-of select="translate(., '-', ' ')"/></xsl:template>来处理所有文本节点。

虽然match="*"允许您匹配所有元素,但您当前的模板将复制根元素并转换并输出其字符串值,但不会进一步处理任何子元素。因此,使用match="text()"更合适,当然没有xsl:copy

当然,对于整个工作方法,您需要使用身份转换模板

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