如何使用xpath获取节点并选择子节点

时间:2012-12-13 15:59:34

标签: xml xpath

我有类似下面的xml:

<?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>

我想选择所有Port节点,包括 only ID,Name,Number和PAR子节点(其余的子节点应该被忽略)。结果应该只是一个端口节点的集合,包括我上面列出的那4个子节点。 这应该是什么样的:

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

非常感谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用单个XPath表达式无法实现您的要求。

XPath表达式选择文档中存在的节点或节点集。如果您使用XPath选择Port元素,那么该元素将不加修改地返回给您,包含其所有现有文档上下文,包括其父元素和子元素。

您可以使用联合Port独立于|选择每个后代元素,或者,您可以选择每个Port元素,然后选择每个Port作为上下文,只选择你想要使用的后代(或删除/忽略你不想要的那些后代)。

如何执行此操作取决于您在检索节点时要对节点执行的操作。如果您希望从输入生成示例输出,那么XSLT可能是一个不错的选择。