2009-12-07 29 views
5

Hãy giúp tôi. Tôi chỉ đang cố gắng khai báo một đoạn cây kết quả đơn giản và lặp lại nó.XSL msxsl: vấn đề về nút-thiết lập


...

<xsl:variable name="rtf"> 
    <item-list> 
    <item id="1">one</item> 
    <item id="2">two</item> 
    <item id="3">three</item> 
    <item id="4">four</item> 
    </item-list> 
</xsl:variable> 

<xsl:for-each select="msxsl:node-set($rtf)/item-list/item"> 
    <xsl:value-of select="@id"/> 
</xsl:for-each> 

...


Tôi hoàn toàn nhầm lẫn về cách làm việc này?


Edit: Tôi đang sử dụng .NET XslCompiledTransform và có tờ khai đúng msxsl namespace - xmlns: msxsl = "urn: schemas-microsoft-com: XSLT"

Các transformating thực hiện tốt - vấn đề là không có gì là đầu ra

+0

Tôi không nghĩ rằng thats đang đủ trong và ngoài bản thân để bất cứ điều gì thực sự đầu ra ... – Murph

+0

tôi m không thực sự chắc chắn những gì bạn có nghĩa là nhưng đây là một đoạn của toàn bộ tập tin xslt. Tất cả mọi thứ trên và dưới đầu ra chỉ tốt. Nó chỉ là rtf và nút-set mà không hoạt động như mong đợi. – Maleks

Trả lời

8

nghi ngờ của tôi là bạn có một không gian tên mặc định tuyên bố trong stylesheet của bạn. Điều đó có hiệu quả sẽ đặt các phần tử < item-list> và < item> vào một không gian tên. Để chọn các phần tử đủ điều kiện không gian tên bằng XPath 1.0, bạn phải luôn sử dụng tiền tố trong biểu thức.

Vì vậy, nếu bạn có một cái gì đó như thế này ở trên cùng của stylesheet của bạn:

<xsl:stylesheet xmlns="http://example.com"...> 

Sau đó, bạn sẽ cần phải cũng để thêm video này:

<xsl:stylesheet xmlns="http://example.com" xmlns:x="http://example.com"...> 

Và sau đó sử dụng dấu "x" tiền tố trong biểu thức XPath của bạn:

<xsl:for-each select="msxsl:node-set($rtf)/x:item-list/x:item"> 
    <xsl:value-of select="@id"/> 
</xsl:for-each> 

Hãy cho tôi biết điều đó có thực hiện hay không. Tôi chỉ suy đoán ở đây.

+0

Thiên tài. Làm việc một điều trị. – Maleks

+0

suy đoán của bạn là đúng! – Safor

1

Điều này có vẻ ổn với tôi.

Bạn đã khai báo chính xác không gian tên msxsl cho các chức năng mở rộng chưa? Một cái gì đó như thế này:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

Tôi giả sử bạn đang sử dụng bộ vi xử lý Microsoft XSLT đây

+0

Đúng, sử dụng công nghệ MS và đã đăng ký đúng không gian tên. – Maleks

4

Không giống như MSXSL, XslCompiledTransform cung cấp node-set() chức năng nó ở đâu supposed to be - trong EXSLT namespace chung:

<xsl:stylesheet xmlns:exslt="http://exslt.org/common"> 
    ... 
    <xsl:for-each select="exslt:node-set($rtf)/item-list/item"> 
    ... 
</xsl:stylesheet> 
+0

Cảm ơn những người đứng đầu. – Maleks

+0

@Pavel Minaev Cảm ơn rất nhiều! Tôi sử dụng xslt và python và trong trường hợp của tôi, đó là giải pháp tuyệt vời. – daikini