xsl

2011-08-23 30 views
5

Nếu tôi có XSL nàyxsl

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html"/> 
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:value-of select="//Description" /> 
    </xsl:template> 
</xsl:stylesheet> 

Và XML này

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LookupValue> 
    <Description>AGL</Description> 
    <Value>8</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Australian Power &amp; Gas</Description> 
    <Value>6</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>EnergyAustralia</Description> 
    <Value>13</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Origin Energy</Description> 
    <Value>9</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>TRU Energy</Description> 
    <Value>7</Value> 
    </LookupValue> 
</ArrayOfLookupValue> 

Làm thế nào để thực sự có được một số dữ liệu từ dòng này:

<xsl:value-of select="//Description" /> 

Tôi đã dành giờ về điều này và tôi đã đi đến kết luận rằng xmlns = namespace là điều khiến tôi đau buồn.

Bất kỳ trợ giúp nào được đánh giá cao.

BTW XML đến từ một dịch vụ web để tôi có thể không chỉ là "thay đổi" nó - Tôi có thể preprocess nó nhưng đó không phải là lý tưởng ...

Ngoài ra tôi đã xác nhận rằng loại bỏ các không gian tên từ một giả định của XML không khắc phục được vấn đề.

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho lời giải thích và một giải pháp ngắn và dễ dàng. –

+0

Bạn đúng rằng không gian tên đang tạo sự khác biệt. Xem lời giải thích tốt của Dimitre ... và bạn sẽ thực sự tiết kiệm thời gian trong tương lai nếu bạn đọc trên các không gian tên XML (đặc biệt, như được sử dụng trong XPath). – LarsH

Trả lời

12

Đây là câu hỏi thường gặp nhất cho cả XPath và XSLT.

Câu trả lời ngắn gọn là rằng trong XPath một tên không được sửa đổi được coi là thuộc về "không có không gian tên". Tuy nhiên, trong một tài liệu với một không gian tên mặc định, các tên không được cố định thuộc về không gian tên mặc định.

Do đó, đối với tài liệu như vậy biểu thức

//Description 

chọn gì (vì không có Description (hoặc bất kỳ yếu tố khác) trong tài liệu đó thuộc về "không gian tên" - tất cả các yếu tố tên thuộc về không gian tên mặc định).

Giải pháp:

Xác định một không gian tên trong XSLT của bạn mà có cùng namespace-uri() như không gian tên mặc định của tài liệu XML. Sau đó sử dụng tiền tố của không gian tên để định nghĩa cho bất kỳ tên được sử dụng trong một biểu thức XPath:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://switchwise.com.au/"> 
    <xsl:output method="html"/> 
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:copy-of select="//x:Description" /> 
    </xsl:template> 
</xsl:stylesheet> 

Khi chuyển đổi này được áp dụng cho các tài liệu XML cung cấp:

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LookupValue> 
    <Description>AGL</Description> 
    <Value>8</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Australian Power &amp; Gas</Description> 
    <Value>6</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>EnergyAustralia</Description> 
    <Value>13</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Origin Energy</Description> 
    <Value>9</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>TRU Energy</Description> 
    <Value>7</Value> 
    </LookupValue> 
</ArrayOfLookupValue> 

các truy nã, chính xác kết quả được tạo ra:

<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>AGL</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>Australian Power &amp; Gas</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>EnergyAustralia</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>Origin Energy</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>TRU Energy</Description> 
+0

+1 câu trả lời hay. Làm thế nào để bạn đánh dấu một câu hỏi như là một câu hỏi thường gặp bằng cách này? – LarsH

+0

@LarsH: Tôi không nghĩ rằng có một cách để đánh dấu câu hỏi là Câu hỏi thường gặp - hiện tại Câu hỏi thường gặp được xác định bởi số lượt xem mà họ có - đó thực sự là "Được xem nhiều nhất". Và những gì chúng tôi cần không phải là câu hỏi thường gặp bat FAT - các chủ đề thường được hỏi :) –

+0

LOL - Thật dễ dàng khi bạn biết làm thế nào !!!Cảm ơn bạn rất nhiều vì một câu trả lời đơn giản, dễ hiểu, tôi đã đặt những thay đổi này vào XSL của tôi và nó hoạt động như mong đợi. Cảm ơn một lần nữa !! – Rob