0

我正在尝试运行以下模板:

<xsl:template match="*[starts-with(., 'ATTITUDE_')]/text()">
 <xsl:variable name="ElementName" select="local-name()"/>
 <xsl:variable name="vVal" select= "$vAttitudes[. = substring-after(current(), '_')]/@val"/>
 <xsl:choose>
    <xsl:when test="contains($ElementName, 'Refuse')">
      <xsl:value-of select="civf:book-capitalise($vAttitudes[@val = $vVal+1])"/>
    </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="civf:book-capitalise($vAttitudes[@val = $vVal])"/>
   </xsl:otherwise>
 </xsl:choose>
</xsl:template>

所以前提是,找到元素的名称,如果它的名称中有文本“拒绝”,那么“doTheThing”+1,否则就是“doTheThing”。但是,此测试总是失败,因此即使元素名称中有“拒绝”,也不会调用 +1。如果我只输出本地名称,那么我也会变空。为什么 local-name() 似乎在这里不起作用?

我之前确实尝试过使用以下方法启动模板:

<xsl:template match="*[contains(., 'Refuse')]/name()">

但 Saxon 抱怨我在匹配序列中运行了太多函数。

对于对 XSLT 不太了解,我提前道歉。

4

1 回答 1

1

我相信这local-name()不起作用,因为您正在匹配文本节点(/text()match属性中),并且文本节点没有本地名称。

我不确定您要做什么,但我认为您实际上并不想匹配/text(),而是要匹配整个元素,然后再获取它text()

或者,您可以尝试使用local-name(..)来获取父节点的名称,但我不确定。

于 2012-07-18T07:02:27.643 回答