XPath/XQuery:选择一个根节点及其不带子节点的属性

发布于 2024-09-19 08:44:45 字数 233 浏览 10 评论 0原文

我有一个 xml:

<Customer id="">
 <Name />
 <Address />
</Customer>

我只想选择一个具有其属性的根节点,而不选择其子节点:

<Customer id=""/ >

使用 XPath 可以实现这样的操作吗?

I have an xml:

<Customer id="">
 <Name />
 <Address />
</Customer>

I would like to select ONLY a root node with its attributes without its child nodes:

<Customer id=""/ >

Is such thing possible with XPath?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一场信仰旅途 2024-09-26 08:44:45

不,这在 XPath 中是不可能的。

您无法选择没有子节点的节点,因为没有子节点,它将是一个不同的节点,因此您不会从原始文档中选择节点。

要创建您想要的输出,您需要使用一种允许您创建新节点的语言,因此您无法在 XPath 中执行此操作。您可以使用 XQuery 创建新节点,这应该可以工作:

element {fn:node-name(/*)} {/*/@*}

No, this is not possible in XPath.

You can't select the node without its children, because without its children it would be a different node, hence you would not be selecting a node from the original document.

To create the output you want you need to use a language which allows you to create new nodes, so you can't do it in XPath. You can use XQuery to create new nodes, this should work:

element {fn:node-name(/*)} {/*/@*}
野味少女 2024-09-26 08:44:45

XPath 不会更改任何源 XML 文档,这是设计使然

要从现有 XML 文档生成新的 XML 文档,需要进行转换。

XSLT 专门用于将一组树(包括 XML 文档)转换为结果树。

此转换

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

    <xsl:template match="/*">
      <xsl:copy>
       <xsl:copy-of select="@*"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<Customer id="">
    <Name />
    <Address />
</Customer>

产生所需的正确结果

<Customer id=""/>

XPath does not alter any source XML document and this is by design.

To produce a new XML document from an existing one, transformation is needed.

XSLT has been especially designed for transforming a set of trees (including XML documents) into result trees.

This transformation:

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

    <xsl:template match="/*">
      <xsl:copy>
       <xsl:copy-of select="@*"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<Customer id="">
    <Name />
    <Address />
</Customer>

produces the wanted, correct result:

<Customer id=""/>
一抹微笑 2024-09-26 08:44:45
$doc = new DOMDocument();
$doc->loadHTML($str);

$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',  'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '<Customer id=\"\">')]";
$elements = $xPath->query($xPathQuery);

if($elements->length > 0){

foreach($elements as $element){
    print "Found: " .$element->nodeValue."<br />";
}
$doc = new DOMDocument();
$doc->loadHTML($str);

$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',  'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '<Customer id=\"\">')]";
$elements = $xPath->query($xPathQuery);

if($elements->length > 0){

foreach($elements as $element){
    print "Found: " .$element->nodeValue."<br />";
}
像你 2024-09-26 08:44:45

此 XQuery 表达式:

element {name(/*)} {/*/@*}

输出:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>

This XQuery expression:

element {name(/*)} {/*/@*}

Output:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文