我是XSLT的新手,遇到了我认为应该工作但却没有的东西。我很困惑,希望你能帮忙。
我有以下代码:
<xsl:template match="text()" name="multiReplace">
<xsl:param name="pText" select="."/>
<xsl:variable name="patterns">
<pattern>
<old>A</old>
<new>B</new>
</pattern>
<pattern>
<old>v</old>
<new>w</new>
</pattern>
</xsl:variable>
<xsl:if test="string-length($pText) >0">
<xsl:variable name="matchingPatterns" select="$patterns[starts-with($pText, old/node())]"/>
<!-- Do something with the tree fragment "matchingPatterns" -->
</xsl:if>
</xsl:template>
据我了解,select="$patterns[starts-with($pText, old/node())]"
应仅匹配节点patterns
与字符串old
的开头匹配的$pText
树的元素。相反,$matchingPatterns
包含patterns
树中的所有节点。我知道$pText
不包含任何大写'A'字符但确实包含小写'v'的事实。
我遗失了一些明显错误的东西吗?
感谢您的帮助!
-j
p.s。,这段代码的要点来自这个问题:XSL Multiple search and replace function。该代码是为XSLT 1编写的;我们正在使用2,它在某种程度上对我来说无法正常使用。
答案 0 :(得分:2)
鉴于
<xsl:variable name="patterns">
<pattern>
<old>A</old>
<new>B</new>
</pattern>
<pattern>
<old>v</old>
<new>w</new>
</pattern>
</xsl:variable>
在XSLT 2.0中,变量是一个树片段,由一个包含两个pattern
元素的根节点组成,因此您的变量定义应为
<xsl:variable name="matchingPatterns" select="$patterns/pattern[starts-with($pText, old)]"/>
选择符合条件的pattern
元素。
作为替代方案,请使用<xsl:variable name="matchingPatterns" select="$patterns[starts-with($pText, old)]"/>
,但请务必设置
<xsl:variable name="patterns" as="element(pattern)*">
<pattern>
<old>A</old>
<new>B</new>
</pattern>
<pattern>
<old>v</old>
<new>w</new>
</pattern>
</xsl:variable>
在这种情况下,您的patterns
变量是一系列无父{i}个元素,而不是一个根节点包含pattern
元素的树片段。
答案 1 :(得分:0)
虽然您可以使用旧的/ node(),但这可能并不总是有效,因为它将匹配任何节点而不仅仅是文本节点。
我认为问题在于你不会迭代模式中的值。 你应该添加一个for-each。
<xsl:for-each select="old">
...
</xsl:for-each>