Как я могу проверить, является ли значение XML ноль в XSLT - PullRequest
6 голосов
/ 09 июня 2011

В XML-документе у меня есть некоторые адресные данные ..

<zip>08001</zip>
<zipPlus xsi:nil="true" />

и

<zip>08002</zip>
<zipPlus>4512</zipPlus>

При необходимости отображать значение zip plus нужно только в том случае, если есть значение для использования,(для целей этого примера мне все равно, правильный ли это формат zip plus)

Попытка использовать следующий фрагмент в XSLT никогда не работает должным образом, и я думаю, что это должноделать с тем, как я проверяю значение xsl: nil

<EmployerZipCode>
      <xsl:value-of select="zip"/>
      <xsl:if test="zipPlus != @xsl:nil">
        <xsl:value-of select="'-'"/>
        <xsl:value-of select="zipPlus"/>
      </xsl:if>
      <xsl:value-of select="$sepChar"/> <!--this is a comma -->
</EmployerZipCode>

Я всегда получаю

08001,
08002,

не

08001,
08002-4512,

Как правильно проверить наличие нулевых светодиодных элементов в XSLT?Есть ли другие способы обойти эту проблему и получить желаемый результат?

Ответы [ 5 ]

6 голосов
/ 09 июня 2011
<xsl:if test="not(zipPlus/@xsi:nil='true')">
5 голосов
/ 10 июня 2011

В XSLT 2.0, по причинам, которые я никогда полностью не понимал, есть пользовательская функция

test="not(nilled(zipPlus))"
3 голосов
/ 11 июня 2011

После еще одного тестирования ни один из ответов, включающих проверку атрибута nil, не работает надежно.

Мне пришлось прибегнуть к использованию string-length (), чтобы получить нужный мне результат.

<EmployerZipCode>
  <xsl:value-of select="zip"/>
  <xsl:if test="string-length(zipPlus) &gt; 0">
    <xsl:value-of select="'-'"/>
    <xsl:value-of select="zipPlus"/>
  </xsl:if>
  <xsl:value-of select="$sepChar"/>
</EmployerZipCode>
1 голос
/ 18 октября 2011

у меня работает

Исходный XML:

            <zipPlus xsi:nil="true"/>
                      or
            <zipPlus>123456</zipPlus>

XSLT:

            <xsl:if test="not(zipPlus/@xsl:nil='true')">
                <xsl:value-of select="zipPlus"/>
            </xsl:if>

Результат XML

            <zipPlus/>
            or
            <zipPlus>123456</zipPlus>
1 голос
/ 11 июня 2011

Очень странно, что ты не заставил его работать.Возможно, вам не хватает объявления пространства имен или изменение префикса xsi на xsl является невидимой опечаткой в ​​вашем преобразовании.Проверьте лучше.Вот мой тест:

XSLT 1.0 с Saxon 6,5

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="test">
    <xsl:output method="text" indent="yes"/>

    <xsl:template match="EmployerZipCode">
        <EmployerZipCode>
            <xsl:value-of select="zip"/>
            <xsl:if test="not(zipPlus/@xsi:nil)">
                <xsl:value-of select="'-'"/>
                <xsl:value-of select="zipPlus"/>
            </xsl:if>
            <xsl:value-of select="','"/> <!--this is a comma -->
        </EmployerZipCode>
    </xsl:template>
</xsl:stylesheet>

С учетом ввода:

<?xml version="1.0" encoding="utf-8"?>
<test xmlns:xsi="test">
    <EmployerZipCode>
        <zip>08001</zip>
        <zipPlus xsi:nil="true" />
    </EmployerZipCode>
    <EmployerZipCode>
        <zip>08002</zip>
        <zipPlus>4512</zipPlus>
    </EmployerZipCode>
</test>

Производит:

08001,
08002-4512,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...