2010-04-20 34 views
10

Tôi có một xml như thế này:Làm cách nào để đổi tên thuộc tính bằng XSLT?

<person name="foo" gender = "male" /> 

tôi muốn biến nó để

<person id="foo" gender="male" /> 

Có cách nào để làm điều đó bằng XSLT?

  • tôi sẽ có rất nhiều nút con trong người

  • tôi sẽ có các thuộc tính ở người.

+0

Điều đó có vẻ giống như đổi tên thuộc tính cho tôi, trừ khi có nhiều trường hợp thực tế của bạn không được đưa vào câu hỏi. –

Trả lời

13

này là rất đơn giản: Sử dụng danh tính biến đổi và tạo ra một mẫu mà biến đổi thuộc tính name:

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

<xsl:template match="@name"> 
    <xsl:attribute name="id"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

này sẽ để lại tất cả mọi thứ trong tài liệu trừ name thuộc tính chính xác như nó được. Nếu bạn chỉ muốn thay đổi thuộc tính name trên các yếu tố person, hãy đặt XPath hạn chế hơn trong thuộc tính match của mẫu, ví dụ: person/@name.

+0

Ngắn gọn, sạch sẽ, đơn giản. Câu trả lời tuyệt vời. – markusk

+0

Làm việc rất đẹp. – unj2

-1

này nên làm điều đó, không hoàn toàn chắc chắn về {name()} nhưng bạn có thể thay thế mà với "người"

> <xsl:template match="person"> 
>  <xsl:element name="{name()}"> 
>   <xsl:attribute name="id"> 
>   <xsl:value-of select="@name"/> 
>   </xsl:attribute> 
>   <xsl:attribute name="gender"> 
>   <xsl:value-of select="@gender"/> 
>   </xsl:attribute> 
>  </xsl:element> 
>  </xsl:template> 
+0

Tôi có cần tạo thuộc tính cho mọi thuộc tính mà tôi có không? Tôi có thể sao chép tất cả các thuộc tính không bao gồm id không? – unj2

+0

Thật là điên khi sử dụng 'xsl: element', một mẫu giá trị thuộc tính và hàm' name() 'để tạo một phần tử có tên mà bạn đã biết. Thay thế '' bằng '' và bạn cũng có thể thay thế các phần tử 'xsl: attribute' bằng AVT. Làm tất cả những điều đó và câu trả lời vẫn không đúng (câu trả lời cho câu hỏi của kunjaan là "không, trừ khi bạn làm như thế này"), nhưng nó sẽ ít sai. –

+0

Chỉ cố gắng cung cấp một giải pháp chung chung có thể hoạt động đối với bất kỳ phần tử nào bất kể tên. Nếu nó sẽ chỉ bao giờ được cho các yếu tố , sau đó tất nhiên các giải pháp mã hóa cứng đơn giản sẽ tốt hơn. – derek

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