正如标题中所提到的,我有两个XML文件,如下面的结构
A.XML
<Root>
<J>
<N>
//here I want to include B.xml
</N>
</J>
</Root>
B.XML
<Root>
<M></M>
<O></O>
<P></P>
</Root>
我可以使用Xinclude,但这也包括B.XML
中A.xml
的根元素。
在包括A.xml
之后我想要B.xml
<Root>
<J>
<N>
<M></M>
<O></O>
<P></P>
</N>
</J>
</Root>
请帮我解决这个问题。
答案 0 :(得分:1)
见这里:
https://blogs.gnome.org/shaunm/2011/07/21/understanding-xinclude/
你可以这样做:
<include href="someFile.xml" xpointer="xpointer(/Root/M)" xmlns="http://www.w3.org/2001/XInclude"/>
<include href="someFile.xml" xpointer="xpointer(/Root/O)" xmlns="http://www.w3.org/2001/XInclude"/>
<include href="someFile.xml" xpointer="xpointer(/Root/P)" xmlns="http://www.w3.org/2001/XInclude"/>
可能是更好的方法 - 只是介绍一个想法。
或者,如果您有选项,可以尝试不同的xml结构。 B.xml可以&#34; N&#34;作为它的根本例如?
<N>
<M>
<O>
<P>
</N>
然后将文件包含在一级。当然,这可能是不可能的,N可能有其他内容,或者您可能无法更改xml结构。
答案 1 :(得分:1)
正如afrogonabike所提到的,你可以使用XInclude和XPointer来选择需要包含哪些元素。不幸的是,XPointer没有指定通配符,它们是否可能取决于实现。因此,除非你事先知道B.xml
中哪些元素会出现,否则你将失去运气。在实现中支持XPoint之间似乎存在很大差异,因此以一种可移植或可靠的方式使其工作可能会很棘手。
我建议你改用XSLT。 XPath更方便,并且XSLT具有document()
函数来引用其他文档中的元素而不是作为输入提供的元素。以下是您工作的基础:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="N">
<xsl:copy>
<xsl:apply-templates select="document('B.xml')/*/*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
默认情况下,样式表将复制任何节点和属性。如果它遇到N
元素,它将复制该元素,但它不会处理内容,而是将模板应用于引用文档的根元素(B.xml)。
请注意,这只适用于B.xml
与输入文档位于同一位置的情况。如果您不是从文件开始,而是从流中开始,那么您必须提出其他内容。它取决于你的环境。根据所使用的XSLT处理器,您可以将B的内容作为参数提供给转换。