2009-07-13 20 views
7

Tôi có một tình huống mà thông số sẽ không được đặt, nhưng nỗ lực của tôi để chụp & xử lý kích thước không hoạt động.XSLT: Thông số kiểm tra để biết nếu nó đã được thiết lập

Tôi đang sử dụng như sau:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" /> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if no value, default to 'AcRec' --> 
     <xsl:when test="not($prefix)"> 
     <xsl:value-of select="'AcRec'" /> 
     </xsl:when> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- if 'AcRec', set the value --> 
     <xsl:when test="$prefix = 'AcRec'"> 
     <xsl:value-of select="$prefix" /> 
     </xsl:when>    
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 

Tôi cũng đã thử $ prefix = '' trong các thử nghiệm đầu tiên - không phải làm việc. nhưng nếu tôi sử dụng:

<xsl:value-of select="not($prefix)" /> 

... giá trị in ra là đúng. Nhưng việc sử dụng nó trong xsl: select của tôi không tạo ra bất kỳ đầu ra nào.

Trả lời

0

Trong số các đề xuất được đưa ra cho đến nay, giải pháp duy nhất hoạt động là luôn đặt giá trị tham số khi thực hiện cuộc gọi đến mẫu. Ví dụ, trước đây tôi đã có:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" /> 

này phải được thay đổi để:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']"> 
    <xsl:with-param name="prefix" select="'AcRec'" /> 
</xsl:apply-templates> 

Tôi thực sự muốn biết tại sao không ($ param) và $ param = '' không làm việc trong một thử nghiệm WHEN, nhưng tôi có thể nhận được giá trị của không ($ param) trong một tuyên bố xsl: value-of.

1

Lưu ý: thay thế câu trả lời cũ, kiểm tra lịch sử nếu bạn muốn.

Các đầu vào sau:

<test xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="something"/> 
    <xs:complexType name="somethingElse"/> 
</test> 

Fed XSLT sau:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:template match="/"> 
     <xsl:for-each select="node()"> 
      <xsl:apply-templates/> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="xs:complexType"> 
     <xsl:param name="prefix" /> 
     <xsl:variable name="prefix-no-core"> 
      <xsl:choose> 
       <xsl:when test="not($prefix)">AcRec</xsl:when> 
       <xsl:when test="$prefix = 'core'"/> 
       <xsl:when test="$prefix = 'AcRec'">AcRec</xsl:when>      
      </xsl:choose> 
     </xsl:variable> 

     <xs:complexType name="{concat($prefix-no-core, @name)}"/> 
    </xsl:template> 
</xsl:transform> 

Cho kết quả sau:

<xs:complexType name="AcRecsomething" xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 
<xs:complexType name="AcRecsomethingElse" xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

Tôi không chắc chắn những gì hơn bạn đang tìm kiếm ...

+0

Tôi cần hỗ trợ khả năng của các tiền tố khác. –

+0

Đã thử - xsl: nếu không thì sẽ mang lại cho tôi các kết quả dương tính giả, áp dụng tiền tố cho những gì không được. –

+0

Khi nào bạn không muốn áp dụng tiền tố? Một lần nữa, hãy cung cấp cho chúng tôi trường hợp sử dụng hoàn chỉnh. Nếu tiền tố = core, bạn không muốn tiền tố. Nếu tiền tố không được đặt, bạn muốn AcDec làm tiền tố. Trường hợp khác là gì? Bạn có muốn sử dụng tiền tố được cung cấp hay bạn muốn phải thêm trường hợp theo cách thủ công cho mỗi tiền tố "được phép". Nếu vậy, điều gì sẽ xảy ra với người gọi cung cấp một tiền tố mà bạn không nhận ra? –

1

Đó là một hack, nhưng tôi đã thành công bằng cách đầu tiên gói tham số với hàm normalize-space() trước khi thử nghiệm cho một tham số rỗng.

<xsl:value-of select="not(normalize-space($prefix))" /> 
+0

Tôi đã thử rằng như một mệnh đề khi - nó đã được xử lý tích cực sai. –

8

Bạn có thể chỉ định giá trị mặc định cho thông số, theo cách đó khi thông số không được chuyển, bạn có thể kiểm tra.

Mặc dù trong ví dụ của bạn, có vẻ như chỉ có một giá trị mặc định sẽ đơn giản hóa mọi thứ.

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" select="'default-value'" /> <!-- SET default --> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if no value, default to 'AcRec' --> 
     <xsl:when test="$prefix = 'default-value'"> 
     <xsl:value-of select="'AcRec'" /> 
     </xsl:when> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- if 'AcRec', set the value --> 
     <xsl:when test="$prefix = 'AcRec'"> 
     <xsl:value-of select="$prefix" /> 
     </xsl:when>      
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 

Gọi như thế này, và giá trị sẽ được 'mặc định có giá trị':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" /> 

Gọi như thế này, và giá trị sẽ được 'thông qua giá trị':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']"> 
    <xsl:with-param name="prefix" value="'passed-value'"/> 
</xsl:apply-templates> 

EDIT: Để hoàn thành, mẫu đơn giản của ví dụ ban đầu là:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" select="'AcRec'"/> 

    <xsl:variable name="prefix-no-core"> 
    <xsl:choose> 
     <!-- if 'core', leave as empty string --> 
     <xsl:when test="$prefix = 'core'"> 
     </xsl:when> 
     <!-- defaults to 'AcRec' --> 
     <xsl:otherwise> 
     <xsl:value-of select="$prefix" /> 
     </xsl:otherwise>      
    </xsl:choose> 
    </xsl:variable> 

    <xs:complexType name="{concat($prefix-no-core, @name)}"> 
    ... 
</xsl:template> 
+0

Nếu bạn cần giá trị mặc định của thông số không đến từ bất kỳ phần tử XML nào (ví dụ: giá trị chữ được mã hóa cứng), hãy sử dụng ' giá trị chữ ở đây' –

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