xml - 在XPath中使用转换功能会产生错误

标签 xml xpath

我必须进行不区分大小写的XML搜索。我已经编写了运行良好的XPath表达式,但是当我在XPath表达式中使用translate函数时遇到错误。下面是运行良好的XPath表达式:

string upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string lower = "abcdefghijklmnopqrstuvwxyz";

string xpath = "/data/item[AID/@iskey='true' and AID/text() = 'fep'][not(*[@iskey][local-name() != 'AID' ])]";       

string xpath1 = "/data/item[translate('Aid','" + upper + "','" + lower + "')]";


这是我的XML:

<?xml version="1.0" encoding="utf-8"?>
<data>
<item>
 <AID iskey="true">fep</AID>
  <account>MS</account>
  </item>
</data>


我想将translate函数放在第一个XPath表达式中,如下所示:

 string xpath = "/data/item[translate('AID','" + upper + "','" + lower + "')/@iskey='true' and translate('AID','" + upper + "','" + lower + "')/text() = 'fep'][not(*[@iskey][local-name() != translate('aid','" + upper + "','" + lower + "') ])]";


当我这样做时,出现以下错误:


表达式必须计算为节点集。


这个xpath对我来说很好用。

 string col="AID"; 
 string xpath = "/data/item[col/@iskey='true' and col/text() = 'fep'][not(*[@iskey][local-name() != 'col' ])]";   


现在,我的要求是col值在任何情况下都可以是大写或小写,因此我希望对xpath进行更改,无论它在xml中存在哪种情况,它都将通过xpath返回结果。
如果用户提供帮助,援助或援助,则返回结果。

最佳答案

该错误是由于以下事实造成的:在您的XPath表达式中,您具有如下所示的位置步骤:

item['aid'/@isKey = 'true' ...]


子表达式:

'aid'/@isKey


在XPath上在语法上是非法的,因为/运算符的左侧必须是节点集-在这里它只是一个字符串。

您想要一个这样的XPath表达式-而不是当前正在生成的表达式:

/data/item
       [*[translate(name(), 'aid', 'AID') = 'AID']/@iskey='true'
      and
        *[translate(name(), 'aid', 'AID') = 'AID'] = 'fep'
         ]
          [not(*[@iskey]
                [translate(name(), 'aid', 'AID') != 'AID']
             )
         ]


基于XSLT的验证:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vLower" select="'aid'"/>
 <xsl:variable name="vUpper" select="'AID'"/>

 <xsl:template match="node()|@*">
     <xsl:copy-of select=
      "/data/item
           [*[translate(name(), 'aid', 'AID') = 'AID']/@iskey='true'
          and
            *[translate(name(), 'aid', 'AID') = 'AID'] = 'fep'
             ]
              [not(*[@iskey]
                    [translate(name(), 'aid', 'AID') != 'AID']
                 )
             ]
      "/>
 </xsl:template>
</xsl:stylesheet>


在提供的XML文档上应用此转换时:

<data>
    <item>
        <AID iskey="true">fep</AID>
        <account>MS</account>
    </item>
</data>


将评估XPath表达式,并将选定的节点(在这种情况下仅为一个)复制到输出:

<item>
   <AID iskey="true">fep</AID>
   <account>MS</account>
</item>


更新:

OP难以理解该解决方案。这是向他显示该解决方案适用于字符串“ aid”的任何大写的示例:

当上述转换应用于XML文档时,该文档包含的元素名称可以是“ aid”的任何大写字母,例如:

<data>
    <item>
        <aId iskey="true">fep</aId>
        <account>MS</account>
    </item>
</data>


再次产生预期结果:

<item>
   <aId iskey="true">fep</aId>
   <account>MS</account>
</item>


更新2:

OP仍然不理解该解决方案,并声称对于特定的XML文档(如下所示):“我使用了您的表达式,它返回null”

这是OP注释中提供的XML文档:

<data>
    <item>
        <aId iskey="true">fep</aId>
        <account>FG</account>
    </item>
</data>


当针对此文档运行相同的XSLT验证时,再次选择正确的元素并输出:

<item>
   <aId iskey="true">fep</aId>
   <account>FG</account>
</item>

关于xml - 在XPath中使用转换功能会产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11365104/

相关文章:

python - 我只想要 XML 元素的直接子元素,而不是所有后代

xml - 在 VBScript 中为 Dummy 导航 XML 节点

c# - 如何使用 XPath 选择带有引号字符的文本?

python - 如何在 AngularJS 网站上的 Python 中使用 Selenium 迭代和保存动态表中的信息

python - CSS 或 xpath :select the first 2 elements

android - 使用 xml drawable 渲染问题

php - 在PHP中解析XSD文件并显示XSD中的元素

python - 如何使用 selenium 和 Python 根据 HTML 单击网页上的元素

java - 使用 jSoup 查找具有某些特定文本的节点

javascript - 如何使用 Firebug xpath.js 脚本?