2013-08-30 4 views
0

Я знаю, что вопросы, подобные этому, были заданы, но я не могу понять, что не так с моим тестом.Тест XSL для отсутствующего атрибута

Вот 3 варианта того, как может выглядеть мой XML; Я пытаюсь определить наличие значения для <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> 

Мне нужно найти экземпляры, где значение - пустая строка или значение null. Это мои условия.

       <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> 

Мой тест для пустых строк работ, но не для недостающего элемента т.е. тест = «нет (Apsīte: Apsīte/Apsīte: адрес)»> не работает.

Не могли бы вы сообщить, что мне не хватает?

Спасибо.

+0

Я думаю, что вы имеете в виду отсутствующий элемент 'element', а не атрибут' attribute'. В ваших исходных исходных документах нет атрибутов. '' является элементом XML ** **. –

+0

Попробуйте 'test =" not (../ apsite: address) "вместо" test = "not (apsite: apsite/apsite: address)". Вам также может понравиться использовать шаблоны, а не уродливую цепочку xsl: если инструкции. –

+0

Спасибо @ SeanB.Durkin Я изменил ссылку от атрибута к элементу. Пробовал (../ apsite: address) с тем же отрицательным результатом. – 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> 

Test Case 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

Смежные вопросы