Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 选择没有特定子节点的节点_Xslt_Xpath_Lxml - Fatal编程技术网

Xslt 选择没有特定子节点的节点

Xslt 选择没有特定子节点的节点,xslt,xpath,lxml,Xslt,Xpath,Lxml,例如,我有这样一个XML示例 <a> <a1>A1</a1> <a11>A11</a11> <a2>A2</a2> Text <strong>text</strong> text... <a> 此xpath: //a[normalize-space(.)='A2 Text text text...'] 只会选择: <a>

例如,我有这样一个XML示例

<a>
    <a1>A1</a1>
        <a11>A11</a11>
    <a2>A2</a2>
    Text <strong>text</strong> text...
<a>
此xpath:

//a[normalize-space(.)='A2 Text text text...']
只会选择:

<a>
    <a2>A2</a2>
    Text <strong>text</strong> text...
</a>

A2
TextTextText。。。

XSLT示例

XML输入

<doc>
  <a>
    <a1>A1</a1>
    <a11>A11</a11>
    <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>
  <a>
    <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>  
</doc>
  <a>
   <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>

A1
A11
A2
TextTextText。。。
A2
TextTextText。。。
XSLT1.0

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

  <xsl:template match="/">
    <xsl:copy-of select="//a[normalize-space(.)='A2 Text text text...']"/>
  </xsl:template>

</xsl:stylesheet>

XML输出

<doc>
  <a>
    <a1>A1</a1>
    <a11>A11</a11>
    <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>
  <a>
    <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>  
</doc>
  <a>
   <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>

A2
TextTextText。。。

不确定这对您来说是否足够灵活,但应该可以让您开始

/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]

您可以在这里轻松地使用它:

XPath是XML文档的查询语言。这意味着XPath表达式只能选择一组节点和/或提取数据

记住:XPath表达式永远不会导致XML文档结构的修改(例如删除节点)

答案是没有XPath表达式会选择您想要的节点,因为XML文档中没有这样的节点

使用XSLT和XQuery可以很容易地实现您想要的:

<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:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[starts-with(name(), 'a1')]"/>
</xsl:stylesheet>

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

<a>
    <a1>A1</a1>
    <a11>A11</a11>
    <a2>A2</a2>     Text 
    <strong>text</strong> text... 
</a>
<a>
   <a2>A2</a2>     Text 
    <strong>text</strong> text... 
</a>

A1
A11
A2文本
文本文本。。。
生成所需的正确结果:

<a>
    <a1>A1</a1>
    <a11>A11</a11>
    <a2>A2</a2>     Text 
    <strong>text</strong> text... 
</a>
<a>
   <a2>A2</a2>     Text 
    <strong>text</strong> text... 
</a>

A2文本
文本文本。。。

可能是因为XPath表达式根本不选择节点?@DimitreNovatchev-可能是我误解了这个问题。我以为OP有两个不同的
,只想选择一个。在这种情况下,xpath会选择
a
节点。我添加了一个示例来说明我的误解。如果将此答案中的转换应用于问题中提供的XML文档,则结果是空字符串。@DimitreNovatchev-我在Xalan、Saxon 6.5.5、Saxon HE 9.3和Saxon EE 9.3中尝试过。所有这些都对我有用。是的,但是你没有对OP提供的XML文档应用转换。这不完全是我想要的,但我已经能够修改它了。也谢谢你的网站