我们希望替换整个xml文件中的一些特殊字符,并使用XSLT1.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文件,其中可能包含需要用"*"替换的字符。在选择值时应用translate函数是一个巨大的过程。
有谁能指导我如何替换xml文件中的字符,然后使用XSLT1.0应用模板来获得预期的响应吗?。
预期响应:
<?xml version="1.0" encoding="utf-8"?>
<Candidate>
<Address>
<ContactAddress>
12 Streetn*
London*
</ContactAddress>
</Address>
<Name>Rames*</Name>
</Candidate>
将替换放入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>
最干净的方法是运行两个独立XSLT转换的管道。这样可以保持代码的模块化和可重用性。有许多工具允许您在管道中运行转换,例如XProc、Ant、xmlsh、Java/。NET API,或者只是一个shell脚本。