我有类似下面的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
...
非常感谢!
答案 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可能是一个不错的选择。