2013-08-21 18 views
5

Khi thử nghiệm của tôi được chạy với XSpec, có một vấn đề rõ ràng: URI cơ sở của các biến toàn cầu được đặt cho cha mẹ xspec đang chạy XSLT của tôi và không phải là đầu vào XML.Làm cách nào để có được URI cơ sở mong muốn khi xsl được chạy từ một tệp khác?

Do đó, khi phép biến đổi XSL của tôi tự chạy với XML, mọi thứ đều ổn và các biến toàn cầu đang chọn những gì chúng cần: các phần tử trong XML đầu vào.

Tuy nhiên, khi nó được chạy qua XSpec, cơ sở URI được thiết lập để XSpec bản thân - có lẽ vì spec XSLT định nghĩa base URI như:

Nếu một lệnh yếu tố hoặc xử lý xảy ra trong một thực thể bên ngoài, URI cơ bản của phần tử đó hoặc lệnh xử lý là URI của thực thể bên ngoài; nếu không, URI cơ sở là URI cơ bản của tài liệu.

Đó là vấn đề đối với tôi. Tôi đã thử sử dụng thuộc tính xml:base trên cả hai biến và xsl:stylesheet: nhưng điều đó dường như không ảnh hưởng đến URI cơ sở; nó chỉ bị ảnh hưởng fn:static-base-uri(). Ngoài ra, static-base-uri() luôn trả về đúng URI mà tôi muốn - vì vậy tôi muốn giá trị đó bằng cách nào đó trở thành URI cơ sở cho các biến toàn cầu của tôi.

Khi tôi di chuyển các biến vào một mẫu và chúng trở thành cục bộ, URI cơ sở của chúng là tốt. Nhưng điều đó sẽ đánh bại toàn bộ điểm của việc sử dụng các biến cho tôi, và đó không phải là nhân đôi các cuộc gọi chọn.

Bất kỳ mẹo nào về cách giải quyết vấn đề này?

Tôi đang sử dụng XSLT 2.0 với SAXON EE 9.4.0.6 (& phiên bản HE).


Cập nhật 1

tôi đã thực hiện điều tra một số chi tiết, và có vẻ như XSpec gọi Saxon theo cách này:

java -cp "%CP%" net.sf.saxon.Transform -o:%RESULT% -s:%XSPEC% -xsl:%TEST_STYLESHEET% -it:{http://www.jenitennison.com/xslt/xspec}main

Có nghĩa là -s, nguồn Tệp XML, là bản định kiểu .xspec. Làm cho tinh thần nếu nó phải cung cấp một số dữ liệu XML cho phép chuyển đổi hoạt động, nhưng trong trường hợp này, nó là chuyển đổi chính nó nhập dữ liệu XML mà nó hoạt động thông qua fn:doc() - và không may trong phạm vi toàn cầu của tôi. uri là sai và không được đặt thành tài liệu được nhập nhưng vào biểu định kiểu xspec.

Vì vậy, như một bài kiểm tra, tôi đặt cờ Saxon -s thành tài liệu đầu vào XML và tada - URI cơ bản bây giờ là chính xác. Nhưng điều này có nghĩa rằng tôi không thể sử dụng bất kỳ xml khác trong xspec và do đó không phải là một giải pháp rất khả thi.


Cập nhật 2

Với một số thông tin phản hồi từ hơn Michael Kay (nhờ!), Tôi đã đính kèm minimal test case Tôi đang làm việc với. Bạn cũng sẽ muốn tải xuống XSpec 0.4-rc1, nhưng điều đó không cần thiết.

Khi bạn đã có XSpec, nếu bạn đang sử dụng Windows, xspec-0.4.0rc1/bin/xspec.bat cần phải được chỉnh sửa để trỏ đến bình Saxon trên dòng 3.

Nếu không, để chạy nó, bạn hãy xspec.bat .\DCM2EA.xspec.

URI cơ sở trong toàn cầu ở đầu ra sẽ, lý tưởng, trỏ đến NEHTA-00009-Adverse_Reaction-Structure (sample data).xml. Ngay bây giờ, nó không - nó trỏ đến .xspec. Điều này bị ảnh hưởng trực tiếp bởi -s:%XSPEC% trong xspec.bat trên dòng 73.

Cách xspec hoạt động là nó tạo ra một phép chuyển đổi trung gian cho DCM2EA.xspec và các phép thử riêng của nó trong xspec/DCM2EA.xsl và chạy phép biến đổi đó (đó là lý do tại sao XSpec trong trường hợp này là tùy chọn, bạn có thể chạy xspec - bad attribute name/xspec/DCM2EA.xsl trực tiếp).

Sự cố tôi gặp phải là base-uri() trong ngữ cảnh chung trong DCM2EA.xsl ban đầu được đặt thành tệp xspec, điều này sai. Các base-uri() bên trong một mẫu được thiết lập tốt (như bạn thấy bởi Base URI now trong đầu ra), nhưng nó không thực tế để di chuyển các biến đến phạm vi địa phương.

Chỉ định dữ liệu xml đầu vào không khả thi vì tệp .xspec thực tế của tôi nhập nhiều tệp khác nhau và tôi không muốn chia nhỏ 190 thử nghiệm mà tôi có và thêm các cách giải quyết khác.

Tôi đã hy vọng rằng xml:base sẽ trợ giúp ở đây, nhưng tôi đã không làm cho nó hoạt động và không có giải pháp.

Cảm ơn bạn đã tìm kiếm!

+2

Phân tích của bạn về tình hình là gần, nhưng không chính xác 100%. Khi giá trị của một biến toàn cầu là một tài liệu tạm thời, URI cơ sở của tài liệu đó luôn là URI cơ sở của biểu định kiểu: có nghĩa là, giống như static-base-uri(). Tôi nghĩ chúng ta cần thấy một số mã, cụ thể là khi bạn nói "URI cơ bản" được đặt thành chính XSpec, chúng ta cần xem URI cơ bản nào bạn đang nói đến và cách bạn đang sử dụng nó. –

+0

Trong trường hợp này tài liệu tạm thời là một tệp .xsl thực tế được tạo và sau đó chạy dưới dạng một phép biến đổi (quá trình được quản lý bởi một tập lệnh shell). Điều đó không rõ ràng ở đó, tôi xin lỗi. Tôi đã đính kèm trường hợp kiểm tra ngay bây giờ và giải thích cách tôi đang làm việc với nó, cảm ơn bạn đã trả lời! – Vadi

Trả lời

1

Bởi vì những hạn chế của tôi Tôi không ở một vị trí để kiểm tra mã của bạn hoặc kiểm tra chạy, nhưng tình hình của bạn làm tôi nhớ đến một tình huống tôi đã nơi tôi thay thế như sau:

<xsl:variable name="x" as="element()"> 
    <stuff> 
    <more/> 
    </stuff> 
</xsl:variable> 
.... select="$x" ... 

với những điều sau:

<xsl:variable name="x" as="element()"> 
    <wrapper xml:base="something"> 
    <stuff> 
     <more/> 
    </stuff> 
    </wrapper> 
</xsl:variable> 
.... select="$x/*" ... 

Bằng cách đó <stuff> có cơ sở URI nhưng không có xml: base = thuộc tính, nhưng tôi đang chọn <stuff> trong cả hai tình huống. Tôi nghĩ rằng vấn đề của tôi là tôi cần thiết để thiết lập URI cơ sở nhưng DTD xác nhận tài liệu không cung cấp cho thuộc tính ... hoặc một cái gì đó dọc theo những dòng đó vì nó không có vẻ đúng như tôi đã viết.

Tôi hy vọng điều này sẽ hữu ích.

+0

Có phải '' 'something''' trong xml: base được cho là đặc biệt không?Tôi đã thử: '' ' ' '' Được khai báo trong bối cảnh toàn cục, nhưng vẫn có bối cảnh của nó được thiết lập để biểu định kiểu ban đầu gọi biểu định kiểu con này, và không phải cho các bảng định kiểu con đầu vào XML. Khốn kiếp! – Vadi

+0

Không, không có gì đặc biệt. Tôi đã hy vọng URI cơ sở sẽ gắn vào các phần tử con. Với nhiều thời gian hơn hôm nay để hiểu tình hình của bạn, tôi thấy thực sự rằng đề nghị của tôi sẽ không giúp được gì. Dường như bạn đang mất URI cơ sở trên đường đi đâu đó. Tha thứ cho tôi vì không thể giúp được. –

+0

Không phải lo lắng. Cảm ơn. URI cơ sở chỉ bị mất trong ngữ cảnh chung - nó là tốt trong tất cả các mẫu. Tuy nhiên, do các biến cách hoạt động trong XSLT, tôi cần các biến của tôi chọn các nút để ở trong ngữ cảnh chung. Lòng thương hại. – Vadi

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