2009-05-13 4 views
33

Tôi muốn lấy dữ liệu từ một số tệp XML và chuyển chúng thành một tài liệu XML mới. Tuy nhiên, tôi không muốn định nghĩa của một không gian tên trong XSLT xảy ra trong tài liệu kết quả.XSL: Tránh xuất khẩu defintions không gian tên để tạo ra các tài liệu XML

Nói cách khác:

nguồn:

<Namespace:Root xmlns:Namespace="http://www.something.com"> 

stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:Namespace="http://www.something.com"> 

kết quả:

<resultRoot xmlns:Namespace="http://www.something.com"> 
<!--I don't want the Namespace definition above--> 

Tôi đang sử dụng msxsl cho việc chuyển đổi.

Trả lời

60

Bạn có thể sử dụng exclude-result-prefixes thuộc tính của phần tử xsl:stylesheet để ngăn chặn gian tên từ tài liệu đầu ra:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:Namespace="http://www.something.com" 
     exclude-result-prefixes="Namespace"> 

</xsl:stylesheet> 

Để chặn nhiều không gian tên từ tài liệu đầu ra, hãy chỉ định chúng cách nhau bằng khoảng trắng:

exclude-result-prefixes="ns1 ns2 ns3" 

Từ XSLT specification:

Khi một kiểu sử dụng một tuyên bố namespace chỉ nhằm mục đích giải quyết các cây nguồn, xác định tiền tố trong loại trừ-Kết quả-tiền tố thuộc tính sẽ tránh khai báo namespace thừa trong cây kết quả.

-4

sử dụng phần mở rộng phần tử-tiền tố = "Namespace"

như:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:datetime="http://exslt.org/dates-and-times" 
xmlns:str="http://exslt.org/strings" 
xmlns:exsl="http://exslt.org/common" 
xmlns:uw="xalan://ru.sbtc.util.XSLUtil" 
extension-element-prefixes="exsl str datetime uw" 
version="1.0"> 
+0

Tôi giả sử bạn có nghĩa là loại trừ tiền tố-kết quả? –

+0

Chúng tôi đang sử dụng tiền tố phần tử mở rộng và nó hoạt động tốt. – alamar

+2

tiền tố phần tử mở rộng không có tác dụng tương tự, nhưng nó có tác dụng bổ sung. Bất kỳ phần tử nào bạn đặt vào một trong các không gian tên đó sẽ được hiểu là phần tử mở rộng (chứ không phải là phần tử kết quả theo nghĩa đen). Điều đó cũng có thể thích hợp cho các ví dụ bạn có trong câu trả lời của mình. Nhưng nếu bạn không muốn hành vi bổ sung đó, thì chỉ cần sử dụng các tiền tố loại trừ-kết quả –

9

câu trả lời của divo đã được chọn và phù hợp như vậy.

Nhưng nếu bạn quan tâm đến việc tìm hiểu kỹ hơn, hãy xem phần "Too many namespaces" trong phần phóng to của tôi về chủ đề cực kỳ phổ biến của "Không gian tên trong XSLT". (Có, điều đó có nghĩa là lưỡi trong má. :-))

+0

Xin chào @Evan! Một liên kết rất hữu ích, thực sự! Bí quyết không có không gian tên không mong muốn trong khi sử dụng bản sao chỉ là những gì tôi muốn. Điều làm tôi ngạc nhiên, mặc dù, là thủ thuật này thực sự không hoạt động cho XSLT 2.0 (ví dụ: sử dụng XALAN) nhưng bạn phải đi theo con đường mà bạn phác thảo cho 2.0. Trong XSLT 1.0 (ví dụ: sử dụng 'xsltproc') nó hoạt động tốt. Vì vậy, việc chuyển từ XSLT 1.0 sang bộ vi xử lý XSLT 2.0 thực sự có thể thay đổi đầu ra đáng kể mặc dù ngữ nghĩa các không gian tên phụ không phải là vấn đề hạ lưu ngoại trừ có thể cho các khía cạnh khối lượng. –