2009-03-17 42 views
17

Chúng tôi có một hệ thống hiện tại mà kết quả đầu ra một tập tin XML mà là ở định dạng sau:Chuyển đổi các yếu tố XML để XML thuộc tính sử dụng XSLT

<INVENTORY> 
    <ITEM> 
     <SERIALNUMBER>something</SERIALNUMBER> 
     <LOCATION>something</LOCATION> 
     <BARCODE>something</BARCODE> 
    </ITEM> 
</INVENTORY> 

tôi cần phải sử dụng dữ liệu này để nạp vào lưới tiêu chuẩn .NET 2.0 . Nhưng lưới cần XML phải ở định dạng sau:

<INVENTORY> 
    <ITEM serialNumber="something" location="something" barcode="something"> 
    </ITEM> 
</INVENTORY> 

tức là các nút con của mục cần được chuyển đổi thành thuộc tính của nút mục.

Có ai đó biết cách thực hiện điều này bằng XSLT không?

+0

Vui lòng đọc tài liệu đánh dấu, bạn cần 4 dấu cách hoặc tab để SO nhận dạng mã. – AnthonyWJones

+0

Câu trả lời bạn chấp nhận không tạo ra kết quả mong muốn !!! Một tên thuộc tính phải là "số sê-ri", giải pháp được chấp nhận tạo ra "số sê-ri". Lần tới đừng lừa dối những người dành thời gian giúp đỡ. –

Trả lời

27

Nên hoạt động:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="INVENTORY"> 
    <INVENTORY> 
     <xsl:apply-templates/> 
    </INVENTORY> 
    </xsl:template> 

    <xsl:template match="ITEM"> 
    <ITEM> 
     <xsl:for-each select="*"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="text()"/> 
     </xsl:attribute> 

     </xsl:for-each> 
    </ITEM> 
    </xsl:template> 
</xsl:stylesheet> 

HTH

+0

Cảm ơn tất cả các đề xuất của bạn nhưng điều này dường như là giải pháp đơn giản và năng động nhất :) và làm việc cho tôi :) – eMTeeN

2

này phải làm điều đó:

<xsl:for-each select="//ITEM"> 
    <xsl:element name="ITEM"> 
     <xsl:attribute name="serialNumber"> 
     <xsl:value-of select="SERIALNUMBER"/> 
     </xsl:attribute> 
     <xsl:attribute name="location"> 
     <xsl:value-of select="LOCATION"/> 
     </xsl:attribute> 
     <xsl:attribute name="barcode"> 
     <xsl:value-of select="BARCODE"/> 
     </xsl:attribute> 
    </xsl:element> 
    </xsl:for-each> 

Hoặc sử dụng phím tắt của David:

<xsl:for-each select="//ITEM"> 
    <ITEM serialNumber="{SERIALNUMBER}" location="{LOCATION}" barcode="{BARCODE}"/> 
</xsl:for-each> 
2

Nếu nguồn của bạn trông như thế này:

<row><a>1</a><b>2</b></row> 

và bạn muốn nó trông giống như này:

<row a="1" b="2" /> 

sau đó XSLT này nên làm việc:

<xsl:template match="row"> 
    <row a="{a}" b="{b}" /> 
</xsl:template> 
4

Hai mẫu nên làm điều đó: -

<xsl:template match="ITEM"> 
    <ITEM serialNumber="{SERIALNUMBER}" location="{LOCATION}" barcode="{BARCODE}" /> 
</xsl:template> 

<xsl:template match="INVENTORY"> 
    <INVENTORY> 
     <xsl:apply-templates /> 
    </INVENTORY> 
</xsl:template> 
4

Dưới đây là có lẽ là soluti đơn giản nhất trên mà sẽ chuyển đổi bất kỳ trẻ em-yếu tố của ITEM đến thuộc tính của nó và sẽ tái sản xuất mọi thứ khác như là, trong khi chuyển đổi các tên phần tử cho bất kỳ tên thuộc tính mong muốn:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<!--            --> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="vrtfNameMapping"> 
    <item name="SERIALNUMBER" newName="serialNumber"/> 
    <item name="LOCATION" newName="location"/> 
    <item name="BARCODE" newName="barcode"/> 
    </xsl:variable> 
<!--            --> 
    <xsl:variable name="vNameMapping" select= 
    "document('')/*/xsl:variable[@name='vrtfNameMapping']"/> 
<!--            --> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 
<!--            --> 
    <xsl:template match="ITEM/*"> 
    <xsl:attribute name= 
    "{$vNameMapping/*[@name=name(current())]/@newName}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

khi việc chuyển đổi trên được áp dụng trên quy tài liệu XML:

<INVENTORY> 
    <ITEM> 
     <SERIALNUMBER>something</SERIALNUMBER> 
     <LOCATION>something</LOCATION> 
     <BARCODE>something</BARCODE> 
    </ITEM> 
</INVENTORY> 

kết quả mong muốn được sản xuất:

<INVENTORY> 
    <ITEM serialNumber="something" location="something" barcode="something"/> 
</INVENTORY> 

Do lưu ý sau:

  1. Việc sử dụng các identity rule

  2. Việc sử dụng <xsl:strip-space elements="*"/>

  3. Việc sử dụng các biến vrtfNameMapping mà không cần bất kỳ chức năng xxx:node-set() mở rộng .

  4. Thực tế là chúng tôi xử lý mọi ánh xạ giữa tên và tên mới, không chỉ đơn giản là vỏ bọc thấp hơn.

+0

Không giống như công việc chuyển đổi này. Nó không tạo ra bất kỳ kết quả nào. Chỉ sau: Mark

+0

@ Mark, Điều này có nghĩa bạn có thể có một bộ xử lý lỗi XSLT, hoặc bạn đã không sao chép và dán chính xác Tài liệu XML và sự biến đổi. Tôi vừa thực thi phép chuyển đổi - kết quả tương tự được tạo ra với một số bộ xử lý XSLT –

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