2009-11-20 35 views
5

Tôi có một tệp XML mà tôi cần xóa thuộc tính có tên "Id" (nó phải bị xóa ở bất cứ nơi nào nó xuất hiện) và tôi cũng cần phải đổi tên thẻ cha, trong khi vẫn giữ nguyên các thuộc tính và phần tử con không thay đổi. bạn hãy giúp tôi sửa đổi mã. Tại một thời điểm, tôi chỉ có thể đạt được một trong hai yêu cầu đó. Tôi có nghĩa là tôi có thể xóa hoàn toàn thuộc tính đó khỏi tài liệu hoặc tôi có thể thay đổi thẻ cha .. Đây là mã của tôi để xóa thuộc tính "Id":XSLT: Cách thay đổi tên thẻ gốc và Xóa thuộc tính khỏi tệp XML?

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

Vui lòng giúp tôi thay đổi tên thẻ gốc từ "Gốc" thành "Hàng loạt".

Trả lời

5

Không ai trong số các giải pháp được cung cấp thực sự giải quyết vấn đề : họ chỉ cần đổi tên một phần tử có tên là "Root" (hoặc thậm chí chỉ là t yếu tố op), mà không xác minh rằng phần tử này có thuộc tính "Id".

wwerner gần nhất với giải pháp đúng, nhưng đổi tên cha mẹ của cha mẹ.

Đây là một giải pháp mà có các thuộc tính sau:

  • Nó là đúng.
  • Ngắn gọn.
  • Tổng quát (tên thay thế được chứa trong một biến).

Đây là mã:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:variable name="vRep" select="'Batch'"/> 

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

    <xsl:template match="@Id"/> 

    <xsl:template match="*[@Id]"> 
    <xsl:element name="{$vRep}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

oh! bạn nói đúng! Tôi không bao giờ quan sát điều này, thực tế trong gốc XML thực tế của tôi không bao giờ có thuộc tính "id", do đó, nó đã đi không liên tục tất cả các thời gian .. Tôi thực sự biết ơn bạn :-) Và không có gì có thể từ chối chấp nhận câu trả lời này ..: -) –

2

tôi sẽ cố gắng:

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

Bản sao khối đầu tiên tất cả những gì không được chỉ định, khi bạn sử dụng. Cái thứ hai thay thế @id mà không có gì xảy ra. Tên gọi thứ ba /Root đến /Batch.

+0

thank you very much. :-) –

2
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()|text()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@Id" /> 
<xsl:template match="Root"> 
    <Batch> 
    <xsl:copy-of select="@*|*|text()" /> 
    </Batch> 
</xsl:template> 
+2

Gốc [@Id] trở thành Hàng loạt [@Id] thay vì được lọc ra. Quy tắc Gốc nên áp dụng các mẫu. –

+0

thay vì Tôi đã viết nó hoạt động .. bạn có thể giải thích cho tôi lý do tại sao xslt hoạt động như điều này ? –

+2

bản sao của sẽ tạo bản sao của tất cả mọi thứ được chọn mà không quan tâm đến các mẫu hiện có. áp dụng các mẫu áp dụng các mẫu. Có một mẫu cho @Id có một đầu ra rỗng. –

2

này nên thực hiện công việc:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()|text()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="node()[node()/@Id]"> 
     <batch> 
     <xsl:apply-templates select='@*|*|text()' /> 
     </batch> 
    </xsl:template> 

    <xsl:template match="@Id"> 
    </xsl:template> 
</xsl:stylesheet> 

tôi thử nghiệm với các đầu vào XML sau:

<root anotherAttribute="1"> 
<a Id="1"/> 
<a Id="2"/> 
<a Id="3" anotherAttribute="1"> 
    <b Id="4"/> 
    <b Id="5"/> 
</a> 

+1

Khi tôi hiểu câu hỏi, không chỉ thẻ có tên gốc nên được đổi tên, mà còn tất cả các thẻ cha có chứa phần tử có thuộc tính Id. Nếu điều này là chính xác, chỉ cần kết hợp "Gốc" sẽ không thực hiện công việc. Nếu không, nó là đủ để phù hợp với "Gốc" – wwerner

+0

Cảm ơn bạn rất nhiều. :) –

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