2011-08-20 40 views
17

Tôi có tệp XML và tệp XSLT bên ngoài.Sử dụng XSLT nội tuyến cho một tệp XML

Hiện nay, trong XML của tôi, tôi đề cập đến một liên kết XSLT bên ngoài bằng một href:

<?xml version="1.0" encoding="utf-8"?> 
    <?xml-stylesheet type="text/xsl" href="stylesheet.xsl" ?> 
    <mytag> 
     <t1> </t1> 
     <t2> </t2> 
     <t3> <t3> 
    <mytag> 

Làm thế nào tôi có thể sử dụng inline XSLT để thay thế? Điều này có thể không? Nếu có, làm thế nào?

Trả lời

10

Có, bạn có thể nhúng XSLT vào trong XML của mình.

XSLT là một tập tin XML, vì vậy bạn sẽ chỉ cần phải chắc chắn rằng bạn đặt nó bên trong của phần tử tài liệu của tập tin XML của bạn, do đó các tập tin XML vẫn well-formed.

Trong thực tế, it is described in the XSLT specification:

2.7 Embedding Stylesheets

Thông thường một kiểu XSLT là một tài liệu XML hoàn chỉnh với xsl: stylesheet yếu tố như các yếu tố tài liệu. Tuy nhiên, biểu định kiểu XSLT cũng có thể được nhúng trong tài nguyên khác. Hai hình thức nhúng có thể xảy ra:

  • stylesheet XSLT có thể được textually nhúng trong một tổ chức phi XML tài nguyên, hoặc
  • xsl: element stylesheet có thể xảy ra trong một tài liệu XML khác hơn như tài liệu thành phần.

Để tạo thuận lợi cho dạng nhúng thứ hai, phần tử xsl: stylesheet được phép có thuộc tính ID chỉ định số nhận dạng duy nhất.

LƯU Ý: Để một thuộc tính như vậy được sử dụng với hàm XPath id , nó phải được khai báo trong DTD dưới dạng ID.

Ví dụ sau cho thấy cách xử lý xml-stylesheet lệnh [XML Stylesheet] có thể được sử dụng để cho phép tài liệu chứa biểu định kiểu của riêng nó. Các tham chiếu URI sử dụng một URI tương đối với một định danh đoạn để xác định vị trí xsl: element stylesheet:

<?xml-stylesheet type="text/xml" href="#style1"?> 
<!DOCTYPE doc SYSTEM "doc.dtd"> 
<doc> 
<head> 
<xsl:stylesheet id="style1" 
       version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:import href="doc.xsl"/> 
<xsl:template match="id('foo')"> 
    <fo:block font-weight="bold"><xsl:apply-templates/></fo:block> 
</xsl:template> 
<xsl:template match="xsl:stylesheet"> 
    <!-- ignore --> 
</xsl:template> 
</xsl:stylesheet> 
</head> 
<body> 
<para id="foo"> 
... 
</para> 
</body> 
</doc> 

LƯU Ý: Một kiểu được nhúng trong tài liệu mà nó là được được áp dụng hoặc có thể được bao gồm hoặc nhập vào biểu định kiểu mà được nhúng như vậy thường cần chứa quy tắc mẫu chỉ định rằng các phần tử xsl: stylesheet sẽ bị bỏ qua.

Tùy thuộc vào cách bạn dự định tận dụng nó, bản định kiểu được nhúng có thể không được hỗ trợ. Ví dụ, trong IE 6/7/8.There are some workarounds.

0

Để thử nghiệm trên bộ vi xử lý client-side, sử dụng một self-referencing stylesheet:

<?xml version="1.0" encoding="utf-8"?> 
<!--Reference the file name as the href value--> 
<?xml-stylesheet type="text/xsl" href="html5.xml"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" 
       > 

<!-- Output HTML doctype with text/html content-type and without XML declaration--> 
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="yes" doctype-system="about:legacy-compat" /> 


<!-- Read the children of the stylesheet itself --> 
<xsl:template match="xsl:stylesheet"> 
    <xsl:apply-templates/> 
</xsl:template> 

<!-- Output the HTML markup--> 
<xsl:template match="/"> 
    <html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <link rel="stylesheet" type="text/css" href="foo.css"/> 
    </head> 
    <body> 
     <div class="foo"> 
     <span class="bar"> 
      <span class="baz">1</span> 
     </span> 
     <!--Added comment to fill empty node--> 
     <span class="placeholder"><xsl:comment/></span> 
     </div> 

     <!-- Read matching templates --> 
     <xsl:apply-templates /> 
     <!--Add comment to fill empty script tag--> 
     <script src="foo.js" type="application/x-javascript"><xsl:comment/></script> 
    </body> 
    </html> 
</xsl:template> 

<!-- Don't reprint text nodes within the xsl:stylesheet node --> 
<xsl:template match="text()"/> 

<!-- Read non-namespaced nodes within the xsl:stylesheet node --> 
<xsl:template match="//node()[local-name() = name()]"> 
    <xsl:if test="local-name() = 'foo'"> 
    <xsl:variable name="foo" select="."/> 

    <input type="text" id="{$foo}" value="{$foo}"></input> 
    </xsl:if> 
    <xsl:apply-templates/> 
</xsl:template> 

<test> 
<foo>A</foo> 
<foo>B</foo> 
<foo>C</foo> 
</test> 

</xsl:stylesheet> 
Các vấn đề liên quan