我们想要替换整个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 回答
最简单的方法是运行两个独立的XSLT转换管道 . 这使您的代码保持模块化和可重用 . 有许多工具允许您在管道中运行转换,例如XProc,Ant,xmlsh,Java / .NET API或简单的shell脚本 .
将替换放入text()模板:
并且在你需要它的所有地方应用那个例如