2012-12-13 120 views
0

节点我有类似下面的一个XML:如何获得节点,选择儿童使用XPath

<?xml version='1.0' encoding='utf-8'?> 
<Document> 
    <name>SMTH</name> 
    <Group> 
     <GroupHeader>Some Description</GroupHeader> 
     <Port> 
      <ID>13553</PortID> 
      <Name>Some name</PortName> 
      <Number>PO1005</WorldPortNumber> 
      <Section> 
       <SectionHeader ID="63">General overview</SectionHeader> 
       <PAR ID="59341" updatedate="19/05/2010 08:35:51">Important data</PAR> 
      </Section> 
      <Section> 
       <SectionHeader ID="66">Max size</SectionHeader> 
       <PAR ID="59344" updatedate="19/05/2010 08:35:51">Important data</PAR> 
      </Section> 
     </Port> 
    </Group> 
</Document> 

我想选择所有端口的节点,包括只有 ID,姓名,号码和PAR儿童节点(其余子节点应该被忽略)。结果应该只是包含上面列出的4个子节点的端口节点的集合。 这里是什么是应该是这样的:

Port: 
    ID=234234 
    Name=blabla 
    Number=324234 
    PAR=sdfsdfs 
    PAR=fgfgfg 
Port: 
    ID=5555 
    Name=blabla 
    Number=ghfh 
    PAR=sdfsdfs 
    PAR=fgfgfg 
... 

非常感谢!

+0

我想我会尝试XSLT转换,但要清楚我想要实现的是我希望得到的XML是这样的: ... – szymon

回答

2

财产以后这样的:

<xsl:for-each select="//Port"> 
    <xsl:copy-of select="*[name()='ID' or name()='Name' or name()='Number']"></xsl:copy-of> 
    <xsl:copy-of select="Section/*[name()='PAR']"></xsl:copy-of> 
</xsl:for-each> 

希望有所帮助。 :)

问候, 的Harrie

+0

我的例子的结果应该也是XML。我编写它的方式只是关于层次结构应该如何的概述。结果应该是这样的: ... – szymon

1

你要求什么是不可能实现的一个XPath表达式。

XPath表达式选择节点或节点集,因为它存在于文档中。如果您使用XPath选择Port元素,那么该元素将被修改并返回给您,并具有其所有现有文档上下文,包括其父项和子项。

你可以独立的Port选择每个后代元素,采用了工会|,或者,你可以选择每个Port元素,然后与每个Port为背景,只选择你要使用这些后代(或删除/忽略你不想要的后代)。

如何做到这一点将取决于您在检索节点时打算如何处理节点。如果您希望从输入中生成示例输出,那么XSLT可能是一个不错的选择。