2013-03-23 16 views
7

XSLT của tôi là outputiung một số thẻ với thuộc tính xmlns:x="http://something" ... Làm cách nào để tránh thuộc tính dư thừa này? XML đầu ra không bao giờ sử dụng, không phải trong một số x:tag, cũng như trong một x:attribute.Bỏ qua các vùng tên không cần thiết từ đầu ra


VÍ DỤ HÀNH XML:

<root><p>Hello</p><p>world</p></root> 

VÍ DỤ HÀNH XSL:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink"> 
<xsl:output encoding="UTF-8" method="xml" version="1.0" indent="no"/> 

<xsl:template match="root"><foo> 
    <xsl:for-each select="p"> 
    <p><xsl:value-of select="." /></p> 
    </xsl:for-each></foo> 
    <xsl:for-each select="x"> 
    <link xlink:href="{x}" /> 
    </xsl:for-each></foo> 
</xsl:template> 

VÍ DỤ HÀNH OUTPUT XML:

<foo> 
    <p xmlns:xlink="http://www.w3.org/1999/xlink">Hello</p> 
    <p xmlns:xlink="http://www.w3.org/1999/xlink">world</p> 
</foo> 

Các xmlns:xlink là một chi phí, nó không được sử dụng!


A typical case nơi XSLT phải sử dụng tên miền không gian nhưng sản lượng không:

<xsl:value-of select="php:function('regFunction', .)" /> 
+1

Xin vui lòng, chỉnh sửa các câu hỏi và cung cấp các nguồn tài liệu XML và mã chuyển đổi. Nếu không có những người này phải đoán. –

+0

OK, tôi đã chỉnh sửa: nguồn cho XML-IN, XSLT và XML-OUT. –

Trả lời

6

Như Dimitre đã nói, nếu bạn không sử dụng không gian tên xlink ở bất kỳ đâu trong XSLT của bạn, bạn chỉ cần loại bỏ khai báo không gian tên của nó. Tuy nhiên, nếu XSLT của bạn được thực sự sử dụng nó ở đâu đó rằng bạn đã không được hiển thị chúng tôi, bạn có thể ngăn chặn nó đang được đầu ra bằng cách sử dụng các thuộc tính exclude-result-prefixes:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    exclude-result-prefixes="xlink"> 
+0

Cảm ơn rất nhiều, loại trừ-kết quả tiền tố là công cụ! Về "... chỉ cần loại bỏ khai báo không gian tên của nó ..." giải pháp, tôi đã chỉnh sửa câu hỏi, để tránh trường hợp "tầm thường" này. –

0

Chỉ cần loại bỏ khai gian tên này từ hướng dẫn xsl:stylesheet - nó không được sử dụng (và do đó cần thiết) ở tất cả các :

xmlns:xlink="http://www.w3.org/1999/xlink" 

Toàn bộ chuyển đổi bây giờ trở thành:

<xsl:transform version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output encoding="UTF-8" method="xml" version="1.0" indent="no"/> 

<xsl:template match="root"><foo> 
    <xsl:for-each select="p"> 
    <p class="a"><xsl:value-of select="." /></p> 
    </xsl:for-each></foo> 
</xsl:template> 
</xsl:transform> 

và khi áp dụng trên tài liệu XML cung cấp:

<root><p>Hello</p><p>world</p></root> 

sản xuất kết quả là hoàn toàn miễn namespace:

<foo> 
    <p class="a">Hello</p> 
    <p class="a">world</p> 
</foo> 
+0

Cảm ơn, tôi đã chỉnh sửa với một trường hợp điển hình. Cái còn lại là 'xsl: if' không được sử dụng. –

+0

@PeterKrauss, exclude-result-prefixes = "{} danh sách các tiền tố được phân cách bằng dấu cách" có thể giúp trong nhiều trường hợp. Trong các trường hợp khác, người ta vẫn cần loại bỏ các không gian tên theo mã. BTW, tôi không thấy bất kỳ 'xsl: if' nào trong mã được đăng của bạn. –

+0

Cảm ơn, tôi đã chỉnh sửa lại. –

Các vấn đề liên quan