【发布时间】:2015-09-17 10:46:02
【问题描述】:
我是 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
ps,这段代码的要点来自这个问题:XSL Multiple search and replace function。该代码是为 XSLT 1 编写的;我们使用的是 2,但不知何故,它对我来说无法正常工作。
【问题讨论】:
-
如果您使用的是 XSLT 2.0,那么您为什么要使用递归命名模板而不是使用 replace() 函数呢?
-
可能相关:如果我用文字“A”代替
old/node(),$matchingPatterns为空;如果我用文字 'v' 替换$matchingPatterns包含patterns中的所有元素。 -
@michael.hor257k 我不能使用
replace(),因为我需要替换多个模式。这些模式并不总是单个字符,所以translate()也没有用。 -
"我不能使用 replace(),因为我需要替换多个模式。" 这不是原因:只需将几个 replace() 函数嵌套在一起。
-
@michael.hor257k - 谢谢,但我想我也想了解一下 XSLT 的工作原理。我绝对可以嵌套
replace()语句,但我想知道为什么我的示例不起作用。
标签: xml xslt replace translate