2013-08-30 84 views
0

我知道類似這樣的問題已被提出,但我無法弄清楚我的測試出了什麼問題。測試XSL的缺失屬性

下面是我的XML如何可能的3種變體; 我正在試圖找出<apsite:address>的值,它是一個空字符串或缺少的元素。

<apsite:apsite xmlns="http://www.w3.org/1999/xhtml" > 
    <apsite:name>John</apsite:name> 
    <apsite:address>Some Address</apsite:name> 
</apsite:apsite> 

<apsite:apsite xmlns="http://www.w3.org/1999/xhtml" > 
    <apsite:name>John</apsite:name> 
    <apsite:address></apsite:name> 
</apsite:apsite> 

<apsite:apsite xmlns="http://www.w3.org/1999/xhtml" > 
    <apsite:name>John</apsite:name> 
</apsite:apsite> 

我需要找到值爲空字符串或空值的實例。 這些是我的條件。

       <xsl:if 
       test="../apsite:address = ''"> 
       <dc:source> 
        <xsl:value-of select="." /> 
       </dc:source> 
      </xsl:if> 
      <xsl:if 
       test="not(apsite:apsite/apsite:address)"> 
       <dc:source> 
        <xsl:value-of select="." /> 
       </dc:source> 
      </xsl:if> 
      <xsl:if 
       test="../apsite:adress != ''"> 
       <dc:source> 
        <xsl:value-of select="../apsite:oldAddress" /> 
       </dc:source> 
      </xsl:if> 

我測試空字符串作品,但不是即測試缺少的元素=「沒有(apsite:apsite/apsite:地址)」>不工作。

請問有人能提醒我缺少什麼嗎?

謝謝。

+0

我想你的意思是缺少'元素',而不是缺少'屬性'。您的示例輸入文檔沒有任何屬性。 ''是一個XML **元素**。 –

+0

嘗試'test =「not(../ apsite:address)」'而不是'test =「not(apsite:apsite/apsite:address)」'。您也可以考慮使用模板,而不是使用xsl:if指令的醜陋鏈。 –

+0

Thanks @ SeanB.Durkin我已經將參數從屬性更改爲元素。沒有試過(../ apsite:地址),結果相同。 – Macky

回答

1

該XSLT樣式表1.0 ...

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:apsite="http://stackoverflow.com/questions/18524099" 
    xmlns:dc="some-other-url" > 
<xsl:output indent="yes" omit-xml-declaration="yes" /> 
<xsl:strip-space elements="*" /> 

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

<xsl:template match="apsite:address[.='']"> 
    <dc:source> 
    <xsl:value-of select="'New value'" /> 
    </dc:source> 
    <xsl:comment>&apos;address&apos; element was empty.</xsl:comment> 
</xsl:template> 

<xsl:template match="apsite:address[not(.='')]"> 
    <dc:source> 
    <xsl:value-of select="." /> 
    </dc:source> 
    <xsl:comment>Text of &apos;address&apos; element was copied.</xsl:comment> 
</xsl:template> 

<xsl:template match="apsite:apsite[not(apsite:address)]"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    <dc:source> 
     <xsl:value-of select="'New value'" /> 
    </dc:source> 
    </xsl:copy> 
    <xsl:comment>&apos;address&apos; element was absent.</xsl:comment> 
</xsl:template> 


</xsl:stylesheet> 

...當依次向每個這些3個可能輸入的文件施加...

測試用例1:輸入文檔:

<apsite:apsite xmlns:apsite="http://stackoverflow.com/questions/18524099"> 
    <apsite:name>John</apsite:name> 
    <apsite:address>Some Address</apsite:address> 
</apsite:apsite> 

測試用例2:輸入文檔:

<apsite:apsite xmlns:apsite="http://stackoverflow.com/questions/18524099"> 
    <apsite:name>John</apsite:name> 
    <apsite:address></apsite:address> 
</apsite:apsite> 

測試用例3:輸入文檔:

<apsite:apsite xmlns:apsite="http://stackoverflow.com/questions/18524099"> 
    <apsite:name>John</apsite:name> 
</apsite:apsite> 

...收率分別...

測試用例1輸出:

<apsite:apsite xmlns:apsite="http://stackoverflow.com/questions/18524099"> 
    <apsite:name>John</apsite:name> 
    <dc:source xmlns:dc="some-other-url">Some Address</dc:source> 
    <!--Text of 'address' element was copied.--> 
</apsite:apsite> 

測試案例2輸出:

<apsite:apsite xmlns:apsite="http://stackoverflow.com/questions/18524099"> 
    <apsite:name>John</apsite:name> 
    <dc:source xmlns:dc="some-other-url">New value</dc:source> 
    <!--'address' element was empty.--> 
</apsite:apsite> 

測試案例3輸出:

<apsite:apsite xmlns:apsite="http://stackoverflow.com/questions/18524099"> 
    <apsite:name>John</apsite:name> 
    <dc:source xmlns:dc="some-other-url">New value</dc:source> 
</apsite:apsite> 
<!--'address' element was absent.--> 

我希望這有助於。

+0

謝謝@Sean。我的數據有一些問題,XML測試實際上工作正常。感謝你的幫助。 – Macky