2010-03-21 40 views
6

Tôi có một tài liệu trông giống nhưTôi có thể xây dựng truy vấn XPath động này trong XSLT không?

<root> 
    <element> 
     <subelement1 /> 
     <subelement2 /> 
    </element> 
    <element> 
     <subelement2 /> 
     <subelement1 /> 
    </element> 
</root> 

Trong tấm XSLT của tôi trong bối cảnh /element[2]/[someNode] Tôi muốn để có được một số đại diện cho khoảng cách /element[1]/[someNode] (ví dụ, số lượng anh chị em trước của /element1/[someNode]). Ví dụ: trong ngữ cảnh của /element[2]/subelement1 Tôi muốn có một số cách để lấy số 2, khoảng cách từ /element[1] đến /element[1]/subelement2. Tôi chỉ cần khoảng cách của tên nút đã cho từ phiên bản đầu tiên của <element>.

trực giác tôi nghĩ rằng tôi có thể xây dựng này như

<xsl:variable name="nodename" select="name()" /> 
<xsl:value-of select="/element[1]/$nodename/preceding-sibling::*" /> 

nhưng tiếc là tờ này không biên dịch. Là những gì tôi đang cố gắng để đạt được có thể trong XSLT?

+0

dụ của bạn có vẻ không nhất quán: trong ngữ cảnh của '/ element [2]/[someNode]' bạn muốn tìm '/ element [1]/[someNode]' với ví dụ trong '/ element [2]/subelement1' bạn muốn tìm khoảng cách từ '/ element [1]' đến '/ element [1]/subelement 2' - như vậy là [someNode] ở đây subelement2 hoặc subelement1? –

+0

Xem thêm http://stackoverflow.com/questions/4630023/dynamic-xpath-in-xslt – Vadzim

Trả lời

8
  1. Bạn không thể sử dụng một biến XSLT như trục của một XPATH tuyên bố, nhưng bạn có thể sử dụng nó trong bộ lọc biến vị ngữ. Vì vậy, nếu bạn khớp với bất kỳ phần tử nào (ví dụ: *) và sau đó hạn chế thành phần của tên() bằng giá trị được lưu trữ trong biến của bạn (tức là *[name()=$nodename]) thì XPath sẽ hợp lệ.

  2. XPATH bạn đang xây dựng sẽ trả lại giá trị của phần tử phù hợp. Nếu bạn muốn trả về số lượng phần tử phù hợp với mẫu đó, bạn có thể sử dụng hàm count().

  3. XML mẫu của bạn có phần tử tài liệu <root>, nhưng XPATH của bạn không bao gồm <root>.

này trả về số phần tử trước-sibling sử dụng biến bởi nút bối cảnh giao:

<xsl:variable name="nodename" select="name()" /> 
<xsl:value-of select="count(/root/element[1]/*[name()=$nodename]/preceding-sibling::*)" /> 

Bạn có thể loại bỏ các biến và chỉ sử dụng:

<xsl:value-of select="count(/root/element[1]/*[name()=name(current())]/preceding-sibling::*)" /> 
1

*[name() = $nodename] có thể là những gì bạn muốn thay vì $nodename nhưng sau đó bạn nên xác định tốt hơn hai biến với giá trị của local name() và namespace-uri() và kiểm tra ví dụ: *[local-name() = $localname and namespace-uri() = $namespaceuri] để có một cách an toàn không gian tên của việc lựa chọn các yếu tố.

0

Không thể xây dựng xpath. XPath được biên dịch tĩnh; bạn không thể tạo ra chúng trên bay (hoặc nếu bạn làm thế, chúng chỉ là các chuỗi và không thể được thực thi).

Tuy nhiên, những gì bạn có thể làm là viết một truy vấn mà xảy ra với tham chiếu chéo nhiều giá trị mà chính họ là động ...

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