我有一个处理样式表的样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="xsl:value-of">
<xsl:copy>
<xsl:copy-of select="@*[name() != 'select']"/>
<xsl:if test="@select">
<xsl:attribute name="select">
<xsl:text>concat('[', "</xsl:text>
<xsl:value-of select="@select" />
<xsl:text>", ']')</xsl:text>
</xsl:attribute>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
并且需要能够接受 select 属性中引号的任意组合/序列,并且仍然产生正确的结果。
作为一个微不足道的例子
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="/">
<xsl:value-of select="concat('Style', "sheet")"/>
</xsl:template>
</xsl:stylesheet>
未正确处理。
具体案例有很多疑问:
但这些并不能解决一般问题。我意识到可以使用递归函数来解析所有有问题的字符并将它们替换为对常量值的变量引用,但这需要将整个字符串包装在
concat()
函数中,这将使生成的代码更加难以阅读。
虽然 XSL 2.0
replace()
函数和加倍可以非常直接地解决这个问题,但似乎没有 1.0 解决方案。
当前输出为
<xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:template match="/">
<xsl:value-of select="concat('[', "concat('Style', "sheet")", ']')" />
</xsl:template>
</xsl:stylesheet>
但不会如图所示进行验证。