缺少一些回复:匹配

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 元素的树片段。