0

我有类似于下面的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>

我想选择所有端口节点,包括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
...

非常感谢!

4

2 回答 2

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>

希望有帮助。:)

问候,哈里

于 2012-12-13T16:11:08.017 回答
1

您的要求是不可能用单个 XPath 表达式实现的。

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

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

您如何执行此操作将取决于您在检索节点后打算如何处理这些节点。如果您希望从输入生成示例输出,那么 XSLT 可能是一个不错的选择。

于 2012-12-13T16:17:30.253 回答