2

我正在尝试从参数中选择一些文本并将其放入变量中,该变量只有纯文本。

<xsl:variable name="Underline">
  <xsl:choose>
    <xsl:when test="contains($style-name, 'u')">true</xsl:when>
  </xsl:choose>
</xsl:variable>

此参数 ( $style-name ) 的值可以是来自于strike、em、u、strong、sub 和sup 的任何值或它们的组合。

$style-name: "strike em u sub"

问题是当我使用上面的代码时,它也认为subu是相同的,因为它找到了字符 u。这就是包含的本质。

我在这里做了一些研究:

http://www.w3.org XPATH

XPath 只返回包含文本的元素,而不是它的父元素

但我找不到任何适合我的东西。如果您需要更多信息,请告诉我。

这也只是 XSLT 1.0。我正在使用 Visual Studio 2012,我不是 100% 确定引擎是什么。

我可以提供输入,但它超出了问题的范围,它只是一个子问题。

4

2 回答 2

4

XSLT 2.0 解决方案

分解成一系列标记并使用以下方法进行比较=

<xsl:when test="tokenize($style-name,' ') = 'u')">true</xsl:when>

这会将所有以空格分隔的标记转换为一个序列,并且= 'u'如果任何标记匹配“u”,则将匹配。

XSLT 1.1 解决方案

<xsl:template name="tokenize">
  <xsl:param name="token" />
  <xsl:param name="text"/>
  <xsl:if test="string-length($text)">
     <token><xsl:value-of select="substring-before(concat($text,$token),$token)"/></token>
     <xsl:call-template name="tokenize">
       <xsl:with-param name="text" select="substring-after($text,$token)"/>
       <xsl:with-param name="token" select="$token"/>
     </xsl:call-template>
  </xsl:if>
</xsl:template>

...

<xsl:variable name="tokens">
  <xsl:call-template name="tokenize">
     <xsl:with-param name="text" select="$style-name"/>
     <xsl:with-param name="token" select="' '"/>
  </xsl:call-template>
</xsl:variable>

<xsl:when test="$tokens/token = 'u'">true</xsl:when>

XSLT 1.0 解决方案

需要包含在每个主要 XSL 处理器(包括 MSXSL)中的扩展。将此命名空间声明添加到您的样式表:

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

并更改@test:

<xsl:when test="msxsl:node-set($tokens)/token = 'u'">true</xsl:when>

对于 ESLT 感知处理器(Saxon、xsltproc、Xalan-J、jd.xslt 和 4XSLT),使用xmlns:exsl="http://exslt.org/common"exsl:node-set(). 对于 Xalan-C 使用xmlns:xalan="http://xml.apache.org/xalan"xalan:nodeset().

于 2012-12-20T19:12:43.460 回答
4

这实际上不需要标记化。它应该像这样简单:

<xsl:variable name="Underline">
  <xsl:if test="contains(concat(' ',$style-name,' '),' u ')">true</xsl:if>
</xsl:variable>

或者甚至更好

<xsl:variable name="Underline">
  <xsl:if test="contains(concat(' ',normalize-space($style-name),' '),' u ')">true</xsl:if>
</xsl:variable>

也就是说,如果保证您有一个空格分隔的列表。

于 2012-12-20T22:35:04.277 回答