我有一个处理样式表的样式表
<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>
但不会如图所示进行验证。