替换xml中的字符,并在使用XSLT 1.0替换字符串后应用模板

时间:2016-05-24 10:25:34

标签: xml xslt xslt-1.0

我们希望替换整个xml文件中的一些特殊字符,并使用XSLT 1.0将一些模板应用于xml。

例如,请考虑以下xml文件,

 <?xml version='1.0' encoding='iso-8859-1'?>
<UserDetails>
<Name>RamesÒ</Name>
<RollNumber>101</RollNumber>
<Contact>
<ContactAddress>
12 StreetnÒ,
LondonÒ
</ContactAddress>
<Email>Remaesh@gmail.com</Email>
<PhoneNumber>123566595656</PhoneNumber>
</Contact>
</UserDetails>

对于上面的xml文件,我需要应用一个样式表,该样式表应该在整个xml文件中用“*”替换所有“Ò”,并返回如下所示的结果,

<?xml version="1.0" encoding="utf-8"?>
<Candidate>
<Address>
<ContactAddress>
12 Streetn*
London*
</ContactAddress>
</Address>
<Name>Rames*</Name>
</Candidate>

我已尝试过以下的XSLT,但无法获得预期的输出,

XSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes" encoding="utf-8"/>
    <xsl:preserve-space elements="*"/>
    <xsl:variable name="vAllowedSymbols"
        select="'@1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 
        '"/>

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="translate(.,translate(.,$vAllowedSymbols, '*'),'*')"/>
    </xsl:template> 

    <xsl:template match="/">
        <Candidate>
            <Name>
                <xsl:apply-templates select="//Name" />
            </Name>
            <Address>
                <xsl:apply-templates select="//ContactAddress" />
            </Address>              
        </Candidate>
    </xsl:template>

    <xsl:template match="ContactAddress">
        <xsl:value-of select= "." />
    </xsl:template>

    <xsl:template match="Name">
        <xsl:value-of select= "." />
    </xsl:template>
</xsl:stylesheet>

输出:

    <?xml version="1.0" encoding="utf-8"?>
<Candidate>
<Name>RamesÃ</Name>
<Address>
12 StreetnÃ,
LondonÃ
</Address>
</Candidate>

我试图在选择像

这样的值时翻译角色
<xsl:template match="ContactAddress">
        <xsl:value-of select= "translate(.,translate(.,$vAllowedSymbols, '*'),'*')" />
    </xsl:template>

这将产生预期的输出。但这是示例xml文件,但实际上我们有xml文件,其中包含许多节点,这些节点可能包含需要用“*”替换的字符。选择值时应用翻译功能是一个巨大的过程。

任何人都可以指导我如何替换xml文件中的字符,然后应用模板以使用XSLT 1.0获得预期的响应。

预期回应:

<?xml version="1.0" encoding="utf-8"?>
<Candidate>
<Address>
<ContactAddress>
12 Streetn*
London*
</ContactAddress>
</Address>
<Name>Rames*</Name>
</Candidate>

2 个答案:

答案 0 :(得分:1)

将替换放入text()模板:

<xsl:template match="text()">
    <xsl:value-of select= "translate(.,translate(.,$vAllowedSymbols, '*'),'*')" />
</xsl:template>

并且在你需要它的所有地方都适用那个例如。

<xsl:template match="ContactAddress">
    <xsl:apply-templates select="text()"/>
</xsl:template>

答案 1 :(得分:-1)

最简单的方法是运行两个独立的XSLT转换管道。这使您的代码保持模块化和可重用。有许多工具允许您在管道中运行转换,例如XProc,Ant,xmlsh,Java / .NET API或简单的shell脚本。