2

我有一个如下所示的 XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <Destinations>
            <Destination name="DEST1" >
                <From>AMA*</From>
            </Destination>

            <Destination name="DEST2" >
                <From>AMAZON</From>
            </Destination>

                           <Destination name="DEST3" >
                <From>EBAY</From>
            </Destination>

                           <Destination name="DEST4" >
                <From>*</From>
            </Destination>

        </Destinations>
    </Configuration>

我想查询并找出与提供的输入匹配的所有目的地。

如果我指定 EBAY,我希望 xpath 返回节点名称 = DEST3 和 DEST4(它不关心值),但如果我指定 AMAZON,它需要返回 DEST1、DEST2 和 DEST4,因为 DEST1 中的 AMA* 支持通配符.

到目前为止,我的 XPath 看起来像这样:

/目的地[(从='' 或 From = '*' ) )]/@name

如果指定了输入,我会动态创建 XPATH 表达式并将传入的值插入场地

除了 From 之外,我的 XML 中还有其他元素。

感谢是否有人可以就此提供指点。

谢谢,芒卢

4

1 回答 1

7

以下 XPath 2.0 表达式表达了所需的选择

  /*/*/*[From[matches($pPat, replace(., '\*', '.*'))]]

说明

  1. $pPat变量包含搜索模式(例如“EBAY”、“AMAZON”等)。

  2. 标准 XPath 2.0 函数matches()用于将任何From元素的值与字符串模式匹配。

  3. 任何From元素的值都会转换为 XPath 2.0 支持的标准正则表达式。为此,任何出现的'*'(转义为"\*"不被视为正则'*'表达式中使用的特殊字符而是作为普通字符) 都将替换为字符串".*"

测试

我使用了以下 XSLT 2.0 转换并验证了上述 XPath 2.0 表达式是否按预期选择了元素。要使用它,请将全局参数 $pPat 的值替换为任何所需的值。

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes"/>

    <xsl:param name="pPat" as="xs:string"
     select="'AMAZON'"/>

    <xsl:variable name="vsrchResult" as="element()*"
     select="/*/*/*[From[matches($pPat, replace(., '\*', '.*'))]]"/>

    <xsl:template match="/">
      <xsl:copy-of select="$vsrchResult"/>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于最初提供的 XML 文档时

<Configuration>
    <Destinations>
        <Destination name="DEST1" >
            <From>AMA*</From>
        </Destination>
        <Destination name="DEST2" >
            <From>AMAZON</From>
        </Destination>
        <Destination name="DEST3" >
            <From>EBAY</From>
        </Destination>
        <Destination name="DEST4" >
            <From>*</From>
        </Destination>
    </Destinations>
</Configuration>

产生所需的输出

<Destination name="DEST1">
            <From>AMA*</From>
        </Destination><Destination name="DEST2">
            <From>AMAZON</From>
        </Destination><Destination name="DEST4">
            <From>*</From>
        </Destination>
于 2009-02-12T04:30:00.873 回答