缺少一些东西:匹配

时间:2015-06-30 14:52:15

标签: xml xslt replace translate

我是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,它在某种程度上对我来说无法正常使用。

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>