缺少一些回复:匹配
Missing something re: matching
我是 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,它对我来说开箱后无法正常工作。
虽然您可以使用 old/node(),但这可能并不总是有效,因为它会匹配任何节点而不仅仅是文本节点。
我认为问题在于您没有迭代模式中的值。
您应该添加一个 for-each。
<xsl:for-each select="old">
...
</xsl:for-each>
给定
<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)]"/>
到select那些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
变量是一系列无父元素的 pattern
元素,而不是根节点包含 pattern
元素的树片段。
我是 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,它对我来说开箱后无法正常工作。
虽然您可以使用 old/node(),但这可能并不总是有效,因为它会匹配任何节点而不仅仅是文本节点。
我认为问题在于您没有迭代模式中的值。 您应该添加一个 for-each。
<xsl:for-each select="old">
...
</xsl:for-each>
给定
<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)]"/>
到select那些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
变量是一系列无父元素的 pattern
元素,而不是根节点包含 pattern
元素的树片段。