-1

处理输入中的某些文本与分析字符串的链接,但无法regex-group(last())在脚本中检索。

您可以在https://xsltfiddle.liberty-development.net/bnnZVG检查转换

如您所见,电流输出

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
    <P>Check <Link ID="ID0001">AbC,2013</Link>AbC,2013Marking</P>
    <P>Check <Link ID="ID0001">ABc, 2013</Link>ABc, 2013Marking</P>
    <P>Check <Link ID="ID0001">ABC 2013</Link>ABC 2013Marking</P>
    <P>Check <Link ID="ID0001">ABC</Link>ABCMarking</P>
    <P>Check <Link ID="ID0002">BCA,2013</Link>BCA,2013Marking</P>
    <P>Check <Link ID="ID0002">bcA, 2013</Link>bcA, 2013Marking</P>
    <P>Check <Link ID="ID0002">BCa 2013</Link>BCa 2013Marking</P>
    <P>Check <Link ID="ID0002">bcA</Link>bcAMarking</P>
</TEST>

但预期的输出是

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
    <P>Check <Link ID="ID0001">AbC,2013</Link> Marking</P>
    <P>Check <Link ID="ID0001">ABc, 2013</Link> Marking</P>
    <P>Check <Link ID="ID0001">ABC 2013</Link> Marking</P>
    <P>Check <Link ID="ID0001">ABC</Link> Marking</P>
    <P>Check <Link ID="ID0002">BCA,2013</Link> Marking</P>
    <P>Check <Link ID="ID0002">bcA, 2013</Link> Marking</P>
    <P>Check <Link ID="ID0002">BCa 2013</Link> Marking</P>
    <P>Check <Link ID="ID0002">bcA</Link> Marking</P>
</TEST>

提前致谢

4

1 回答 1

1

您期望调用last()inside of哪个值xsl:analyze-string?如果您查看https://www.w3.org/TR/xslt-30/#element-analyze-string中的最后一段,它会说:

使用 xsl:matching-substring 元素处理匹配的子字符串,使用 xsl:non-matching-substring 元素处理不匹配的子字符串。这些元素中的每一个都以序列构造函数作为其内容。如果该元素不存在,则效果与它以空内容存在时相同。在处理每个子字符串时,子字符串的内容将是上下文项(作为 xs:string 类型的值);子串在匹配和不匹配子串序列中的位置将是上下文位置;匹配和不匹配子串的数量将是上下文大小。

因此,last()返回上下文大小应该等于匹配和不匹配子字符串的数量。

我意识到这不是一个完整的答案,但它太长了,不能用作评论。您可能还想编辑您的问题,并用简单的语言告诉我们您链接到的 XSLT 应该实现什么,然后我们可能能够帮助建议适当的 XSLT 解决方案。

另请注意,带有 XPath 3 的 XSLT 3 有一个analyze-string函数,它返回一个带有匹配项和组的 XML 结构,因此处理/使用可能会帮助您提取所需的内容:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    exclude-result-prefixes="#all"
    version="3.0">

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:key name="testkey" match="link" use="linkname"/>

    <xsl:variable name="testcheck">
        <link name="ID0001">
            <linkname>abc, 2013</linkname>
            <linkname>abc</linkname>
        </link>
        <link name="ID0002">
            <linkname>bca, 2013</linkname>
            <linkname>bca</linkname>
        </link>
    </xsl:variable>

    <xsl:variable name="test">
        <xsl:text>(</xsl:text>
        <xsl:for-each select="$testcheck//linkname">
            <xsl:if test="position() ne 1"><xsl:text>|</xsl:text></xsl:if>
            <xsl:value-of select="."/>
        </xsl:for-each>
        <xsl:text>)</xsl:text>
    </xsl:variable>

    <xsl:variable name="regex" as="xs:string"
      select="concat('(^|\W)', replace($test, ', ([0-9][0-9][0-9][0-9])', '(, $1|,$1| $1)?'), '($|\W)')"/>

    <xsl:template match="text()[matches(., $regex, 'i')]">
         <xsl:apply-templates select="analyze-string(., $regex, 'i')" mode="extract"/>
    </xsl:template>

    <xsl:mode name="extract" on-no-match="text-only-copy"/>

    <xsl:template match="fn:match/fn:group[@nr = 2]" mode="extract">
        <Link ID="{$testcheck//key('testkey', lower-case(replace(current(), '(, |,| )([0-9][0-9][0-9][0-9])', ', $2')))/@name}">
            <xsl:value-of select="."/>
        </Link>          
    </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bnnZVG/2给出

<TEST>
    <P>Check <Link ID="ID0001">AbC,2013</Link> Marking</P>
    <P>Check <Link ID="ID0001">ABc, 2013</Link> Marking</P>
    <P>Check <Link ID="ID0001">ABC 2013</Link> Marking</P>
    <P>Check <Link ID="ID0001">ABC</Link> Marking</P>
    <P>Check <Link ID="ID0002">BCA,2013</Link> Marking</P>
    <P>Check <Link ID="ID0002">bcA, 2013</Link> Marking</P>
    <P>Check <Link ID="ID0002">BCa 2013</Link> Marking</P>
    <P>Check <Link ID="ID0002">bcA</Link> Marking</P>
</TEST>
于 2019-01-29T13:10:29.753 回答