XPath normalize-space()不能用作步进函数?

时间:2017-10-16 12:57:28

标签: c# xml xpath dita

我刚刚设计了一个XPath表达式来查找所有空元素,并在结束后直接返回文本。

我已经在OXYGEN测试了这个XPath,并且正好回归了我正在寻找的东西。由于我还不知道的原因,我无法在Visual Studio(C#)中这样做。

XPath表达式:

//xref[not(@href)]/normalize-space(substring(following-sibling::text()[1], 1, 20))

以下是XPath搜索的DITA(XML)文件示例:

    <?xml version="1.0" encoding="UTF-8"?>
<topic id="topic_50038EEEBC214A0EBF0660DCFFCF69C6"> 
  <title> Postulated Piping Failures in Fluid Systems Outside of
     Containment</title> 
  <prolog> 
     <author/> 
  </prolog> 
  <body> 
     <p> 
        <b>Definitions</b> 
     </p> 
     <p> 
        <u>Leakage</u> 
     </p> 
     <p>
        <xref
            href="t1.3.2.2_System Quality Group Classifications.dita#topic_AE87340A0F424D07B0E301E243CCB7B2"
            format="dita" scope="local"><?xm-replace_text System Quality Group Classifications?></xref>
        TEXT
     </p> 
     <p> 
        <u> 
        </u>TEXT
        <xref></xref>5.2
     </p>
     </body>
</topic>

在OXYGEN中,使用XPath栏,结果为&#34; 5.2&#34;这正是我想要检索的内容。

以下是检索节点的C#:

String xPathFindXREF = "//xref[not(@href)]/normalize-space(substring(following-sibling::text()[1], 1, 20))";
XmlNodeList xmlNodeList = currFile.SelectNodes(xPathFindXREF);

是否可以在C#中使用像normalize-space()这样的XPath函数?

1 个答案:

答案 0 :(得分:4)

您的XPath表达式需要XPath 2.0,Oxygen支持但本机C#库不支持。

顺便说一下,这两个版本的XPath都支持normalize-space()这里不支持normalize-space()。它是使用CONFIG += link_pkgconfig PKGCONFIG += gstreamer-1.0 glib-2.0 gobject-2.0 gstreamer-app-1.0 gstreamer-pbutils-1.0 作为步进函数而不是在需要XPath 2.0的谓词中。

您的选择是使用支持XPath 2.0的C#的XPath库,或通过C#迭代XPath选定的节点,并单独规范化每个节点的字符串值。