2009-01-08 28 views
10

Tôi muốn tạo ra các yếu tố sau:Tạo xmlns: namespace xsi và thuộc tính

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd"> 

Nếu tôi sử dụng một cái gì đó như thế này:

<xsl:element name="excercises"> 
<xsl:attribute name="xmlns:xsi" namespace="http://www.w3.org/2001/XMLSchema-instance"/> 

Sau đó, nó tạo ra soemthing như thế này:

<excercises xp_0:xsi="" xmlns:xp_0="http://www.w3.org/2001/XMLSchema-instance"> 

Không giống như những gì tôi muốn ...

+0

Bạn đang sử dụng trình phân tích cú pháp XSLT nào? – Kev

Trả lời

8

Hãy thử các cách sau để thay thế:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:apply-templates select="xml"></xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="xml"> 
     <xsl:element name="exercises"> 
      <xsl:attribute name="xsi:noNamespaceSchemaLocation">mySchema.xsd</xsl:attribute> 
      some value 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Mối quan tâm chính là khai báo không gian tên xsi trong khai báo.

Tôi vừa tạo mẫu phù hợp để chỉ kiểm tra.

+0

Vì msxsl alais không được sử dụng nên có thể tốt hơn nếu bạn chỉ gỡ bỏ nó, nó sẽ làm cho ví dụ rõ ràng hơn – AnthonyWJones

+0

vâng .... Tôi chỉ làm sạch MS cruft – Kev

+0

thx rất nhiều, và cho con mèo của bạn một cái ôm – eddy147

2

Sau đây là cách này có thể được thực hiện:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
exclude-result-prefixes="xsi"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <!--         --> 
    <xsl:template match="/"> 
     <exercises xsi:noNamespaceSchemaLocation="mySchema.xsd"/> 
    </xsl:template> 
</xsl:stylesheet> 

Khi chuyển đổi này được áp dụng trên bất kỳ nguồn tài liệu XML (không sử dụng), kết quả mong muốn được sản xuất:

<exercises xsi:noNamespaceSchemaLocation="mySchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 

Không cần sử dụng <xsl:attribute> trong trường hợp của bạn, tuy nhiên nếu cần, nó có thể được sử dụng mà không gặp bất kỳ sự cố nào:

<xsl:attribute name="xsi:noNamespaceSchemaLocation"> 
     <xsl:value-of select="'mySchema.xsd'"/> 
    </xsl:attribute> 

Do lưu ý rằng nó là một thực hành tốt chỉ đơn giản là xác định không gian tên cần thiết tại <xsl:stylesheet> yếu tố để họ có thể dễ dàng được (tái) được sử dụng ở khắp mọi nơi khi cần thiết. Điều này đặc biệt hữu ích, nếu cần một không gian tên đã cho trên nhiều phần tử hoặc thuộc tính được tạo ra.

Trong trường hợp này, bạn cũng nên chỉ định tất cả các tiền tố như vậy trong giá trị của thuộc tính exclude-result-prefixes sao cho các không gian tên sẽ không được tự động truyền trên tất cả các thành phần của chữ.

+0

Tại sao bạn sẽ chặn tiền tố kết quả xsi? – AnthonyWJones

+0

@AnthonyWJones: Nếu bạn không bao gồm tiền tố "xsi" trong danh sách các giá trị cho thuộc tính "exclude-result-prefixes", mọi phần tử kết quả theo nghĩa đen sẽ được xuất dưới dạng có nút không gian tên này. Đây là mục đích duy nhất của e.r.p attr. Đọc tại đây: http://www.w3.org/TR/xslt#literal-result-element –

1

Bạn chỉ có thể sử dụng: -

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd"> 

Trực tiếp trong XSL của bạn, điều đó sẽ làm việc, bạn chỉ thực sự cần xsl: element nếu không thể cứng mã tên thẻ. Tương tự như vậy với các thuộc tính bạn có thể thêm chúng trực tiếp trừ khi bạn cần phải thực hiện điều kiện.

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