2009-03-10 17 views
7

Kiểm tra không gian tên bị tắt trên máy chủ xử lý các phép biến đổi XSL (vì người viết XSL không hiểu không gian tên). Tôi phải thay đổi XSL nhưng tôi không thể kiểm tra nó bởi vì không có bất kỳ không gian tên nào được định nghĩa tức là.Có cách nào để bỏ qua các không gian tên trong quá trình chuyển đổi XSL không?

Thay vì

<xsl:template match="ns:element[position()=1]">... 

nó có

<xsl:template match="element[position()=1]">... 

vì vậy nó không phù hợp với bất kỳ của các yếu tố trong XML bởi vì tất cả chúng ta đều có trình độ với namespace.

Tôi không thể kiểm tra trên máy chủ vì tôi không có quyền truy cập vào máy chủ. Nó không sử dụng sửa chữa XSL bởi vì sau đó kiểm tra không gian tên sẽ phải được kích hoạt, và điều đó sẽ phá vỡ tất cả các phép biến đổi khác.

Vì vậy, những gì tôi cần làm là tìm cách bỏ qua các không gian tên trong khi chuyển đổi XSL. Tôi có quyền truy cập vào MSXML, XMLSpy (không thể tìm thấy một tùy chọn ở đây) và nếu tôi thực sự cần phải tôi có thể mã một cái gì đó lên trong C# hoặc một ngôn ngữ tương tự.

Như một phương sách cuối cùng tôi có thể mã lên một vài regexes nhưng tôi thực sự không muốn đi xuống mà tuyến đường, đặc biệt là khi đối phó với XML ...

Để đối phó với một lời nhận xét về biết thêm chi tiết:

Đó là Máy chủ ảo Windows 2003, chạy một cá thể một Servlet Methode (www.eidosmedia.com). Tôi không biết kỹ thuật nào servlet này sử dụng để thực hiện các phép biến đổi XSL. Họ bỏ qua các không gian tên vì người viết XSL ban đầu không hiểu chúng, và không đưa chúng vào XSL. Vì vậy, bây giờ tất cả các tập tin XSL (hàng trăm) không có không gian tên. Có thể là một thách thức thú vị để sửa tất cả các tệp này trong một lần, nhưng đó không phải là những gì tôi cần ngay bây giờ (và người quản lý bộ phận sẽ không bao giờ đồng ý với nó vì số lượng thử nghiệm liên quan). Điều này có thể là một thách thức thú vị. Tất cả những gì tôi muốn biết là nếu có một công cụ (hoặc kỹ thuật) sẵn có sẽ cho phép tôi lấy các tệp XSL này và sử dụng chúng để chuyển đổi một tài liệu XML tương ứng mà không tính đến các không gian tên tài khoản. Dường như với tôi rằng một công cụ phải tồn tại, bởi vì người đã viết bản XSL ban đầu phải đã sử dụng một cái gì đó tương tự để tự kiểm tra các biến đổi.

+0

Làm cách nào để vô hiệu hóa việc kiểm tra không gian tên trên máy chủ? Tôi đã không bao giờ nghe nói về một điều như vậy. –

+0

Đây là sản phẩm của bên thứ 3 (không phải của Microsoft hoặc Sun) xử lý các phép biến đổi. Họ chỉ yêu cầu các nhà phát triển cung cấp cho họ một tùy chọn để vô hiệu hóa nó. – ilitirit

+0

Chúng tôi có thể biết thêm chi tiết không? Chẳng hạn như loại máy chủ, vv Ngoài ra, họ muốn giải quyết vấn đề gì bằng cách bỏ qua các không gian tên? Bỏ qua các không gian tên là rất khó, vì vậy nếu chúng ta biết vấn đề đằng sau vấn đề, chúng ta có thể thử giải quyết vấn đề đó. –

Trả lời

5

Bạn có thể thực hiện chuyển đổi để xóa tất cả không gian tên khỏi dữ liệu nhập của bạn trước khi chuyển đổi "thực". Nhưng ... Tôi không chắc chắn nếu bạn nên làm điều đó. Nó cảm thấy xấu xí.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}" > 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

câu trả lời gốc:

rằng sẽ là một lựa chọn?

<xsl:template match="*[local-name()='element' and position()=1]">... 

(như ý kiến ​​cho thấy - nó sẽ không)

+0

Thật không may là không. Như tôi đã đăng trong một bình luận khác, trận đấu chỉ là một ví dụ. Cũng có các chức năng "chọn". – ilitirit

+0

Ngoài thực tế là có một số công việc cần thiết ... Tại sao điều này không hiệu quả? Tomalak

+0

Tôi không thể nghĩ ra một lý do nào đó nó không hoạt động , nhưng vì số lượng công việc cần thiết tôi cũng có thể viết regexes để loại bỏ/chèn không gian tên. Tất cả những gì tôi muốn biết là có một công cụ cho phép biến đổi mà không có không gian tên. Tôi đã biết các giải pháp khác yêu cầu công việc. – ilitirit

0

bao nhiêu không gian tên đang có trong XML được chuyển?

Nếu 1 bạn có thể tạm thời thêm không gian tên đó làm không gian tên mặc định của XSL của mình không? Ok điều đó có nghĩa là bạn có thể cần thay đổi không gian tên đầu ra vv nhưng một khi đã được kiểm tra, bạn có thể loại bỏ các chỉnh sửa này.

Nếu có nhiều hơn 1 ngụ ý rằng không có xung đột tên cục bộ nào trên các không gian tên. Bạn có thể tinh chỉnh XML đầu vào thử nghiệm để tất cả các bí danh trỏ đến cùng một không gian tên và sau đó thực hiện tinh chỉnh ở trên.

+0

Tôi đã đếm ít nhất 10 không gian tên (đó là tệp SpreadsheetML). Tôi đã loại bỏ các không gian tên từ một tệp đầu vào, nhưng nó không phải là một giải pháp tốt bởi vì tôi phải thực hiện nó mỗi khi tôi kiểm tra một tệp mới. – ilitirit

+0

Ouch. :(Tôi nghi ngờ bạn sẽ tìm thấy một bộ xử lý XSL tự tôn trọng hiện đại sẽ cho phép những gì bạn cần. Đáng buồn là tôi nghĩ rằng các kịch bản RegEx có khả năng là sự truy đòi của chính bạn. – AnthonyWJones

1

Tôi đăng câu trả lời này vì câu trả lời quá dài để phù hợp với nhận xét.

Không có bộ xử lý XSLT mà tôi từng nghe nói cho phép bạn chỉ bỏ qua toàn bộ không gian tên trong XML đầu vào. Nếu bạn có các biến đổi XSL được viết trong sự thiếu hiểu biết về các không gian tên và các tài liệu XML sử dụng chúng, bạn phải sử dụng servlet bị hỏng để thực hiện phép chuyển đổi hoặc xử lý trước các tài liệu XML để loại bỏ các không gian tên.

Biến đổi Tomalak được đăng sẽ làm điều đó - và không giống như sử dụng cụm từ thông dụng, nó sẽ làm điều đó mà không làm hỏng mọi thứ khác trong XML. Và nó không phải là rất nhiều công việc để làm điều đó, một trong hai. Biến đổi chuỗi là khá dễ dàng.

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