我的要求就像
输入: -
<request>
<attribute>
<attributeName>Name</attributeName>
<attributeValue>a & b</attributeValue>
</attribute>
<attribute>
<attributeName>Name1</attributeName>
<attributeValue>b</attributeValue>
</attribute>
</request>
输出: -
<request>
<attribute>
<attributeName>Name</attributeName>
<attributeValue>a & b</attributeValue>
</attribute>
<attribute>
<attributeName>Name1</attributeName>
<attributeValue>b</attributeValue>
</attribute>
</request>
转义字符可以包含n个标记,我需要在运行时替换所有标记,因为属性元素类型是无界的。 我怎样才能在xslt ???
中实现相同的目标答案 0 :(得分:0)
这会产生你想要的输出! (如果没有,请告诉我!)
身份模板,复制所有元素。
ampText 模板,查找包含&
的所有文字
字母模板对文本中的所有字母进行迭代(递归),并将&
的所有实例替换为&
。
<?xml version="1.0" encoding="UTF-8"?>
<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:template name="identity" match="* | @*">
<xsl:copy>
<xsl:apply-templates select="* | @* | text()" />
</xsl:copy>
</xsl:template>
<xsl:template name="ampText" match="text()[contains(.,'&')]">
<xsl:call-template name="letters">
<xsl:with-param name="text" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="letters">
<xsl:param name="text" select="'Some text'" />
<xsl:if test="$text != ''">
<xsl:variable name="letter" select="substring($text, 1, 1)" />
<xsl:choose>
<xsl:when test="$letter = '&'">
<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
</xsl:when>
<xsl:otherwise><xsl:value-of select="$letter" /></xsl:otherwise>
</xsl:choose>
<xsl:call-template name="letters">
<xsl:with-param name="text" select="substring-after($text, $letter)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>