Tôi muốn hợp nhất 2 tệp XML với cùng một cấu trúc để tạo một. Ví dụ;Cách sử dụng xpointer với Xinclude để tham chiếu các phần tử
Test1.xml
<?xml version="1.0" encoding="UTF-8"?>
<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1" />
</ns:element2>
<ns:element2 id="001.2" order="2">
<ns:element3 id="001.1.2" />
</ns:element2>
</ns:element1>
</ns:Root>
và Test2.xml
<?xml version="1.0" encoding="UTF-8"?>
<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="999">
<ns:element2 id="999.1" order="1">
<ns:element3 id="999.1.1" />
</ns:element2>
</ns:element1>
</ns:Root>
Để tạo
TestOutput.xml
<?xml version="1.0" encoding="UTF-8"?>
<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1" />
</ns:element2>
<ns:element2 id="001.2" order="2">
<ns:element3 id="001.1.2" />
</ns:element2>
</ns:element1>
<ns:element1 id="999">
<ns:element2 id="999.1" order="1">
<ns:element3 id="999.1.1" />
</ns:element2>
</ns:element1>
</ns:Root>
tức là một tệp XML có tất cả các phần tử từ mỗi phần tử được bao gồm.
Tôi đã tìm thấy câu hỏi hữu ích trên StackOverflow và đã đưa ra điều này;
Merge.xml
<?xml version="1.0"?>
<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:TestNamespace">
<xi:include href="Test1.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)" />
<xi:include href="Test2.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)" />
</ns:Root>
Mà tôi chạy bằng cách làm này (tôi cần phải sử dụng xmllint vì những lý do để tham gia đi vào)
xmllint -xinclude Merge.xml
Nhưng điều này không hoạt động, nó than phiền về các thiong khác nhau, có vẻ liên quan đến xpointer.
parser error : warning: ChildSeq not starting by /1
Merge.xml:7: element include: XInclude error : XPointer evaluation failed: #element(//ns:Root/ns:element1)
Merge.xml:7: element include: XInclude error : could not load Test1.xml, and no fallback was found
parser error : warning: ChildSeq not starting by /1
Merge.xml:9: element include: XInclude error : XPointer evaluation failed: #element(//ns:Root/ns:element1)
Merge.xml:9: element include: XInclude error : could not load Test2.xml, and no fallback was found
<?xml version="1.0"?>
<ns:Root xmlns:xi="http://www.w3.org/2003/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="urn:TestNamespace">
<xi:include href="Test1.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)"/>
<xi:include href="Test2.xml" parse="xml" xpointer="element(//ns:Root/ns:element1)"/>
</ns:Root>
Nếu tôi bỏ qua các thuộc tính XPointer trong Merge.xml sau đó tôi nhận được một số lượng hợp lý, nhưng nó đã làm hơn bao gồm các yếu tố tôi muốn tất nhiên.
Ai đó có thể cung cấp một số lời khuyên về những gì tôi đang làm sai với xpointer xin vui lòng?
Cảm ơn antcipation.
Nếu tôi loại bỏ không gian tên, các công trình trên, vì vậy đây chỉ là vấn đề với XPointer và cách tôi xử lý các không gian tên – Nerdio
Lược đồ 'element()' không hỗ trợ tên đủ điều kiện (xem https: // www.w3.org/TR/xptr-element/). Một tên được chỉ định với 'element()' phải là một NCName và đề cập đến một phần tử _single_ được xác định bằng một xs: ID của tên đó. Đó rõ ràng không phải là những gì bạn muốn. –