首页 文章

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

提问于
浏览
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 回答

  • 1

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

  • 0

    将替换放入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>
    

相关问题