我已经替换了以下字符,即ÁÁÀÄÖÓÔÒØÅÜÉŠŽááàäöôòøååüéšβźý,而且一切正常。但是,在xslt之后,结果将缺少所有属性名称。
曾经看过stackoverflow并发现了一些很棒的代码,但是由于某种原因,我无法使其正常工作。
我当前的代码: `
<xsl:template match="@*|node()">
<xsl:call-template name="ReplaceChars">
<xsl:with-param name="Input" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:variable name="OddChars">ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý</xsl:variable>
<xsl:variable name="RegChars">AAAAOOOOOAUESZaaaaooooauesszy</xsl:variable>
<xsl:template name="ReplaceChars">
<xsl:param name="Input"/>
<xsl:value-of select="translate(replace(replace($Input, 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:template>
`
工作示例:http://xsltfiddle.liberty-development.net/ej9EGbZ
我该如何解决?
答案 0 :(得分:1)
您的XML中没有属性。缺少的是您的要素。那是因为您没有复制它们。改为尝试这种方式:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="OddChars">ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý</xsl:variable>
<xsl:variable name="RegChars">AAAAOOOOOAUESZaaaaooooauesszy</xsl:variable>
<xsl:template match="text()">
<xsl:value-of select="translate(replace(replace(., 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:template>
</xsl:stylesheet>
请注意,您的问题和样式表都标记为version=1.0"
-但是您使用的是replace()
函数,该函数仅在XSLT 2.0中可用
已添加:
要使其更通用,以便也可以处理实际属性:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="OddChars">ÁÂÀÄÖÓÔÒØÅÜÉŠŽáâàäöôòøåüéšβźý</xsl:variable>
<xsl:variable name="RegChars">AAAAOOOOOAUESZaaaaooooauesszy</xsl:variable>
<xsl:template match="text()">
<xsl:value-of select="translate(replace(replace(., 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="translate(replace(replace(., 'ß','ss'), 'ẞ', 'SS'), $OddChars, $RegChars)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="comment() | processing-instruction()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
由于您使用的是XSLT 2.0,因此也可以使用xsl:character-map
。
看起来很多,但是您可以将字符映射表分解成单独的样式表,然后xsl:include
。
示例...
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" use-character-maps="cm"/>
<xsl:strip-space elements="*"/>
<xsl:character-map name="cm">
<xsl:output-character character="Á" string="A"/>
<xsl:output-character character="Â" string="A"/>
<xsl:output-character character="À" string="A"/>
<xsl:output-character character="Ä" string="A"/>
<xsl:output-character character="Ö" string="O"/>
<xsl:output-character character="Ó" string="O"/>
<xsl:output-character character="Ô" string="O"/>
<xsl:output-character character="Ò" string="O"/>
<xsl:output-character character="Ø" string="O"/>
<xsl:output-character character="Å" string="A"/>
<xsl:output-character character="Ü" string="U"/>
<xsl:output-character character="É" string="E"/>
<xsl:output-character character="Š" string="S"/>
<xsl:output-character character="Ž" string="Z"/>
<xsl:output-character character="á" string="a"/>
<xsl:output-character character="â" string="a"/>
<xsl:output-character character="à" string="a"/>
<xsl:output-character character="ä" string="a"/>
<xsl:output-character character="ö" string="o"/>
<xsl:output-character character="ô" string="o"/>
<xsl:output-character character="ò" string="o"/>
<xsl:output-character character="ø" string="o"/>
<xsl:output-character character="å" string="a"/>
<xsl:output-character character="ü" string="u"/>
<xsl:output-character character="é" string="e"/>
<xsl:output-character character="š" string="s"/>
<xsl:output-character character="β" string="s"/>
<xsl:output-character character="ź" string="z"/>
<xsl:output-character character="ý" string="y"/>
<xsl:output-character character="ß" string="ss"/>
<xsl:output-character character="ẞ" string="SS"/>
</xsl:character-map>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>