2008-09-27 33 views
10

Tôi có một tài liệu XML với các phần tử không có tên và tôi muốn sử dụng XSLT để thêm các không gian tên cho các phần tử đó. Hầu hết các phần tử sẽ nằm trong không gian tên A; một số sẽ nằm trong không gian tên B. Làm thế nào để tôi làm điều này?Thêm không gian tên cho các phần tử

Trả lời

13

Với foo.xml

<foo x="1"> 
    <bar y="2"> 
     <baz z="3"/> 
    </bar> 
    <a-special-element n="8"/> 
</foo> 

và foo.xsl

<xsl:template match="*"> 
     <xsl:element name="{local-name()}" namespace="A" > 
      <xsl:copy-of select="attribute::*"/> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="a-special-element"> 
     <B:a-special-element xmlns:B="B"> 
      <xsl:apply-templates match="children()"/> 
     </B:a-special-element> 
    </xsl:template> 

</xsl:transform> 

tôi nhận được

<foo xmlns="A" x="1"> 
    <bar y="2"> 
     <baz z="3"/> 
    </bar> 
    <B:a-special-element xmlns:B="B"/> 
</foo> 

Là những gì bạn đang tìm kiếm?

+0

Yup; Tôi đã Google trả lời câu trả lời trước bài đăng của bạn và về cơ bản nó giống nhau. Một sự khác biệt là tôi đang sử dụng thay vào đó, nhưng tôi tin rằng chúng giống hệt nhau về mặt chức năng. –

0

Dưới đây là những gì tôi có cho đến nay:

<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="A" > 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="a-special-element"> 
    <B:a-special-element xmlns:B="B"> 
     <xsl:apply-templates /> 
    </B:a-special-element> 
</xsl:template> 

này hầu như làm việc; vấn đề là nó không sao chép các thuộc tính. Từ những gì tôi đã đọc như vậy, phần tử xsl: không có cách nào để sao chép tất cả các thuộc tính từ phần tử như là (sử dụng-thuộc tính-bộ không xuất hiện để cắt nó).

+1

Bạn chưa đọc tài liệu phù hợp. Sử dụng lực, đọc thông số kỹ thuật, nó được viết rất tốt và có thể truy cập được. – ddaa

2

Bạn sẽ cần hai thành phần chính cho công thức này.

Cổ phần nước sốt sẽ là identity transform và hương vị chính sẽ được cung cấp bởi thuộc tính namespace đến xsl:element.

Mã sau, chưa được kiểm tra, nên thêm không gian tên http://example.com/ vào tất cả các phần tử.

<xsl:template match="*"> 
    <xsl:element name="xmpl:{local-name()}" namespace="http://example.com/"> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

Tin nhắn cá nhân: Xin chào, Jeni Tennison. Tôi biết bạn đang đọc cái này.

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