我们希望替换整个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,但无法获得预期的输出,
<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>
答案 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脚本。