2011-09-11 42 views
20

Vui lòng giải thích cho tôi cách sử dụng tham số XSLT tốt nhất. về <xsl:param> & <xsl:with-param>Cách sử dụng XSLT Params; <xsl:param> & <xsl: with-param>

mẫu LỘC:

<xsl:call-template name="ABC"> 
    <xsl:with-param name="title" /> 
</xsl:call-template> 
+1

Câu hỏi hay, +1. Trong khi tôi đưa ra một giải thích chi tiết về 'xsl: param' và' xsl: with-param' trong câu trả lời của tôi, tôi khuyên bạn nên đọc một cuốn sách hay về XSLT. Thực hành là hoàn toàn cần thiết để có thể nắm bắt tốt khái niệm này. –

Trả lời

32

hãy giải thích cho tôi cách tốt nhất param XSLT có thể đã sử dụng. về <xsl:param> & <xsl:with-param>

<xsl:param> có thể được quy định ở cấp toàn cầu bất cứ nơi nào (như một đứa trẻ của xsl:stylesheet) hoặc nếu nó nằm trong một khuôn mẫu, nó phải là con của nó và nó phải đặt trước bất kỳ phi xsl:param con của xsl:template.

Đây là cơ sở cho phép mẫu hoặc toàn bộ phép biến đổi (trong trường hợp toàn cầu là xsl:param) để nhận dữ liệu khác nhau từ người gọi/người khởi xướng mẫu hoặc toàn bộ quá trình chuyển đổi.

Ở mặt bên của người gọi/người khởi xướng mẫu/chuyển đổi, thông số được chuyển bằng cách sử dụng lệnh xsl:with-param. nó có thể là con của xsl:apply-templates hoặc xsl:call-template.

Thuộc tính name của xsl:param hoặc xsl:with-param là bắt buộc. Nó xác định tham số.

Thuộc tính chọn của xsl:with-param có thể được sử dụng để chỉ định bất kỳ biểu thức XPath nào, kết quả của việc đánh giá được chuyển đến mẫu được gọi/được áp dụng.

Hoặc, giá trị có thể được chỉ định trong nội dung (nội dung) của xsl:with-param.

xsl:with-param phải có thuộc tính select hoặc nội dung. nhưng không phải cả hai.

An xsl:param cũng có thể có thuộc tính hoặc nội dung được chọn. Trong trường hợp này, các giá trị này chỉ định giá trị mặc định của thông số và được sử dụng nếu không có thông số nào có tên này được người gọi chỉ định.

Cuối cùng, đây là một ví dụ hoàn chỉnh minh họa hầu hết các khái niệm:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pTarget" select="'love'"/> 
<xsl:param name="pReplacement" select="'like'"/> 

<xsl:template match="/*"> 
    <xsl:call-template name="replace"> 
    <xsl:with-param name="pPattern" select="$pTarget"/> 
    <xsl:with-param name="pRep" select="$pReplacement"/> 
    </xsl:call-template> 

    <xsl:text>&#xA;</xsl:text> 

    <xsl:call-template name="replace"/> 

    <xsl:text>&#xA;</xsl:text> 

    <xsl:apply-templates select="text()"> 
    <xsl:with-param name="pPattern" select="$pTarget"/> 
    <xsl:with-param name="pRep" select="'adore'"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="text()" name="replace"> 
    <xsl:param name="pText" select="."/> 
    <xsl:param name="pPattern" select="'hate'"/> 
    <xsl:param name="pRep" select="'disapprove'"/> 

    <xsl:if test="string-length($pText) >0"> 
     <xsl:choose> 
     <xsl:when test="not(contains($pText, $pPattern))"> 
      <xsl:value-of select="$pText"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="substring-before($pText, $pPattern)"/> 
     <xsl:value-of select="$pRep"/> 

     <xsl:call-template name="replace"> 
      <xsl:with-param name="pPattern" select="$pPattern"/> 
      <xsl:with-param name="pRep" select="$pRep"/> 
      <xsl:with-param name="pText" select= 
      "substring-after($pText, $pPattern)"/> 
     </xsl:call-template> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

Khi áp dụng trên tài liệu XML này ...

<t>Sports stars we really love, love to hate, hate</t> 

... kết quả Là...

Sports stars we really like, like to hate, hate 
Sports stars we really love, love to disapprove, disapprove 
Sports stars we really adore, adore to hate, hate 

Giải thích:

  1. Mẫu replace được gọi là hai lần. Trong cả hai cuộc gọi, tham số pText bị bỏ qua. Giá trị mặc định của nó được sử dụng bởi mẫu được gọi.

  2. Cuộc gọi đầu tiên cung cấp thông số mẫu và thay thế, vì vậy "love" được thay thế bằng "like".

  3. Lưu ý rằng giá trị của các thông số toàn cầu $pTarget$pReplacement được chuyển qua. Nếu người khởi tạo chuyển đổi quyết định chuyển các giá trị khác (không phải mặc định được sử dụng trong mã này) cho các tham số chung này, các giá trị này sẽ được chuyển đến mẫu replace chứ không phải giá trị mặc định "love""like".

  4. Cuộc gọi thứ hai không cung cấp bất kỳ giá trị thông số nào, vì vậy tất cả các giá trị mặc định trong mẫu replace được sử dụng - chuỗi "hate" được thay thế bằng chuỗi "disapprove".

  5. Lưu ý rằng mẫu replace gọi chính nó theo cách đệ quy, để tất cả các lần xuất hiện của mẫu được thay thế bằng thay thế.

  6. Ngoài ra, các giá trị của thông số pText của các cuộc gọi đệ quy không phải là tĩnh, nhưng được tính toán động.

  7. Lần thứ ba mẫu replace được bắt đầu từ bên ngoài là qua xsl:apply-templates. Ở đây chúng tôi cũng cho thấy rằng một mẫu có thể có cả một thuộc tính matchname cùng lúc và có thể bắt đầu một mẫu như vậy bằng cách sử dụng xsl:apply-templatesxsl:call-template.

+0

Đó là câu trả lời hoàn hảo Dimitre. Cảm ơn bạn đã giải thích câu trả lời theo cách chi tiết hơn. Tôi có truy vấn nhỏ, '' & '' nên được sử dụng ở giữa '' & '' hoặc chúng ta có thể sử dụng một trong hai. Nếu có, cái nào là tốt nhất giữa hai mẫu này ('' & '') và cái nào hiệu quả hơn trong việc sử dụng? –

+0

@Siva Charan: 'xsl: param' chỉ được sử dụng làm tham số chung hoặc là con của' xsl: template'. Với cả hai 'xsl: apply-templates' và' xsl: call-templates' cách * only * để chỉ định truyền tham số là thông qua 'xsl: with-param' –

+1

Chúc mừng :).Một lần nữa tôi muốn nói "Cảm ơn" với bạn. –

7

Nó được sử dụng để vượt qua một param quy định tại mẫu khác:

<xsl:param name="globalParam"></xsl:param> 

<xsl:call-template name="ABC"> 
    <xsl:with-param name="title" select="'A Title'" /> 
</xsl:call-template> 

<xsl:template name="ABC"> 
    <xsl:param name="title"/> 
    <xsl:value-of select="$title" /> 
    <xsl:value-of select="$globalParam" /> 
</xsl:template> 
+0

Cảm ơn bạn đã trả lời. ** 'A Title' ** là giá trị tĩnh. đúng? nếu có, chúng ta có thể chuyển một giá trị tĩnh trong XSLT hay không. xin vui lòng giải thích một số thông tin chi tiết theo cách chi tiết ... –

+0

Các param có thể là một giá trị tĩnh hoặc một biểu thức phù hợp. Nếu bạn muốn vượt qua trong một param xác định nó trong phạm vi bên ngoài. Sau đó, bạn có thể đặt nó khi bạn thực hiện biến đổi. – TheCodeKing

+0

Thực ra, như được hiển thị trong câu trả lời của tôi, một mẫu có thể chuyển một 'xsl: param' * vào chính nó * trong một cuộc gọi đệ quy. Do đó, câu lệnh "Nó được sử dụng để chuyển một param được định nghĩa trong một mẫu khác", không hoàn toàn chính xác. –

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