2009-05-19 25 views
7

Tôi có tệp XSL để chuyển một tệp XSL khác. Tôi muốn khai báo không gian tên nằm trên thẻ gốc, thay vì nó được lặp lại trên mọi phần tử đơn lẻ !!Không gian tên thẻ gốc XSLT thay vì không gian tên thuộc tính phần tử

Đây là kiểu của tôi:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mynamespace="somenamespace" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes" /> 
    <xsl:template match="myMatchedNode"> 
     <mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Nó ra một cái gì đó như thế này:

.... 

<mynamespace:tag xmlns:mynamespace="somenamespace">Some text i want inserted into the xsl</mynamespace:tag> 

.... 

Làm thế nào để tôi buộc khai báo không gian tên vào thẻ gốc của kết quả ?!

Trả lời

8

Bạn cần chèn nút không gian tên vào phần tử tài liệu của cây kết quả. Có một số cách để thực hiện việc này, tùy thuộc vào việc bạn đang sử dụng XSLT 1.0 hay 2.0. Sau đây là giải pháp 2.0. Tôi giả định rằng bạn đang làm một bản sắc biến đổi chuyển đổi trên tài liệu đầu vào (câu hỏi của bạn không thực sự rõ):

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- special rule for the document element --> 
    <xsl:template match="/*"> 
    <xsl:copy> 
     <!-- Add a namespace node --> 
     <xsl:namespace name="mynamespace" select="'somenamespace'"/> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

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

    <!-- the rest of your rules --> 

</xsl:stylesheet> 

Đối với bảo hiểm đầy đủ tất cả các kỹ thuật khác nhau để kiểm soát không gian tên trong tài liệu đầu ra của bạn, hãy xem phần "Not enough namespaces" của bài viết "Không gian tên trong XSLT" trên trang web của tôi.

+1

Bạn thưa bạn, là một huyền thoại. Liên kết điên rồ! Cảm ơn bạn! – JavaRocky

+0

Ồ! Và tôi có cuốn sách của bạn. x2 Trạng thái chú giải. – JavaRocky

+0

Cảm ơn những lời tốt bụng của bạn. :-) –

1

Có lẽ tôi hiểu sai câu hỏi, nhưng tôi nghĩ rằng bạn nên làm điều này:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="somenamespace" 
    version="2.0"> 

<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes"/> 

<xsl:template match="myMatchedNode"> 
    <tag>Some text i want inserted into the xsl</mynamespace> 

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

</xsl:stylesheet> 

Điều đó sẽ cho phép bạn sử dụng các thẻ namespace của bạn như là không gian tên mặc định và các tài liệu đầu ra sẽ có chúng như không gian tên mặc định là tốt. Tài liệu đầu vào của bạn vẫn có thể sử dụng cú pháp thẻ mynamespace khó chịu.

Bạn có thể thử làm điều này, quá:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="somenamespace" 
    xmlns:mynamespace="somenamespace" 
    version="2.0"> 

Tôi không hoàn toàn chắc chắn rằng sẽ thay thế MyNameSpace: thẻ chỉ với thẻ mặc dù, và nếu có, nó có thể thực hiện phụ thuộc.

+0

Không, tôi cần làm không gian tên mặc định là một thứ khác. XSL này là một phần của một đường ống XSLT. – JavaRocky

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