样式表属性是否包含任意引用?

时间:2016-07-19 20:16:25

标签: escaping xslt-1.0

我有一个处理样式表的样式表

<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', &quot;sheet&quot;)"/>
  </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('[', &quot;concat('Style', &quot;sheet&quot;)&quot;, ']')" />
  </xsl:template>
</xsl:stylesheet>

但不会如图所示进行验证。

0 个答案:

没有答案