2012-04-10 29 views
6

Chúng tôi sử dụng Altova Stylevision để tạo các tệp XSLT 2.0. Chúng tôi sử dụng Saxon 9 cho Java để thực thi các tệp XSLT này. Điều này đã hoạt động tốt trong vài năm, không ai trong chúng ta thực sự hiểu XSLT.XSLT 2.0 tạo ra lỗi: "mục ngữ cảnh không xác định"

Bây giờ chúng ta có lỗi:

Error at /xsl:stylesheet/xsl:function[9] 
XPDY0002: Axis step child::element(item, xs:anyType) cannot be used here: 
    the context item is undefined 

Chức năng thứ 9 là:

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string"> 
    <xsl:sequence select="concat(string-join(item/string(if (number($XML/report/calculation-data[@data-source-name = $DataSourceParent]/item/variable[@name=&apos;unit_count&apos;]/@value) &lt; 0) then 0 else round-half-to-even(number(variable[@name=&apos;unit_count&apos;]/@value),2)),&apos;,&apos;),&apos;&amp;chxl=0:|&apos;,string-join(item/variable[@name=&apos;month&apos;]/@value,&apos;|&apos;),&apos;|2:||Min&amp;chds=0,&apos;,string(round-half-to-even(max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0)),&apos;&amp;chxr=1,0,&apos;,string(round-half-to-even(max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0)))"/> 
</xsl:function> 

Có ai có bất kỳ ý tưởng gì đang xảy ra?

Trả lời

8

Vấn đề là hàm sử dụng các biểu thức đường dẫn như item cần một mục ngữ cảnh như the specification mandates "Trong phần thân của hàm kiểu định dạng, tiêu điểm ban đầu không xác định, điều này có nghĩa là bất kỳ nỗ lực nào để tham chiếu mục ngữ cảnh, vị trí ngữ cảnh hoặc kích thước ngữ cảnh là lỗi động không thể phục hồi. [XPDY0002] ". Vì vậy, hàm cần có thông số chuyển qua nút hoặc chuỗi các nút mà đường dẫn sẽ được áp dụng, ví dụ:

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string"> 
    <xsl:param name="nodes"/> 
    <xsl:sequence select="concat(string-join($nodes/item/string(...)))"/> 
</xsl:function> 

và sau đó cần được gọi với ví dụ: sps:GoogleChartDataSourceUnitCount(.).

Nếu biểu định kiểu được tạo bởi một số công cụ từ Altova, bạn có thể muốn hỏi trong số Altova forums cho dù đây là sự cố đã biết và liệu có khắc phục được không.

7

Theo W3C XSLT 2.0 specification, mục bối cảnh ban đầu cho số xsl:function không được xác định.

Điều này có nghĩa là bên trong thân hàm có bất kỳ tham chiếu nào đến dữ liệu (mục) chỉ có thể xảy ra các tham số (được truyền hoặc toàn cục) hoặc biến.

Vấn đề là một biểu hiện trong mã được cung cấp bắt đầu với:

concat(string-join(item ... 

và điều này rõ ràng vi phạm các quy tắc trên - item được tham chiếu ra một mục bối cảnh, mà không được phép bên trong an xsl:function.

Giải pháp:

  1. Vượt qua mục bối cảnh dự định như là một tham số (recommended) nói tên pDoc, hoặc có một biến/tham số toàn cầu chứa mục bối cảnh dự định.

  2. mục tham khảo ở bước vị trí đầu tiên của một biểu thức XPath tắt rằng tham số/biến, ví dụ $pDoc/item

FAQ: Tại sao hạn chế này?

Trả lời: Không cho phép một mục ngữ cảnh ngầm ban đầu làm cho bộ xử lý XSLT có thể thực hiện thêm analisis tĩnh rộng hơn và tối ưu hóa mã nhiều hơn nữa.

3

Bạn có thể gặp sự cố này từ các trường hợp sử dụng khác nhau. Đối với tôi, vì tôi quên đặt dấu đô la ($) trước khi tham số bên trong hàm của tôi, để bộ xử lý nghĩ rằng tôi đang sử dụng thẻ nút mà không chỉ ra ngữ cảnh, sau đó đưa ra lỗi này. Tôi chỉ cần đặt $ trước thông số của mình. Hy vọng giải pháp của tôi sẽ hữu ích cho người khác.