如何在没有源xml文件的根节点的情况下将一个xml文件包含在另一个xml中?

时间:2016-04-04 07:35:16

标签: xml xslt

正如标题中所提到的,我有两个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.XMLA.xml的根元素。 在包括A.xml之后我想要B.xml

<Root>
    <J>
        <N>
            <M></M>
            <O></O>
            <P></P>
        </N>
    </J>
</Root>

请帮我解决这个问题。

2 个答案:

答案 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的内容作为参数提供给转换。