xslt в атрибуте xml - PullRequest
       0

xslt в атрибуте xml

0 голосов
/ 30 ноября 2018

У меня есть XML-элемент Tyle Boleean.

<testelement>0</testelement>

Я использую xslt для преобразования значения в no / yes в зависимости от значения 0/1, и оно прекрасно работает

<xsl:choose>
    <xsl:when test="./text()='0'">
        <xsl:text>No</xsl:text>
    </xsl:when>
    <xsl:when test="./text()='1'">
        <xsl:text>Yes</xsl:text>
    </xsl:when>
    <xsl:otherwise>
        <xsl:message terminate="yes">The Yes/No value to be translated did not match expected input</xsl:message>
    </xsl:otherwise>
</xsl:choose>

То же самое я пытаюсь сделать с типом атрибута boolean.Элемент имеет maxOcc неограниченный.

<element attribute="0">
...
</element>
<element attribute="1">
...
</element>

В xlts:

<xsl:choose>
                   <xsl:when test="//@attribute='0'">
        <xsl:text>No</xsl:text>
    </xsl:when>
                   <xsl:when test="//@attribute='1'">
        <xsl:text>Yes</xsl:text>
    </xsl:when>
    <xsl:otherwise>
        <xsl:message terminate="no">The Yes/No value to be translated did not match expected input</xsl:message>
    </xsl:otherwise>
</xsl:choose>

Но после того, как я использую этот код, все значения равны Да или все значения Нет, в зависимости от значения в первом элементе узла.Например, если 0 в первом элементе, все значения - Нет, и не имеет значения, что во втором - 1. Как правильно преобразовать его?Спасибо

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вот лучший способ сделать это:

<xsl:template match="node()[.='0'] | @*[.='0']" mode="toYesNo"/>No</xsl:template>
<xsl:template match="node()[.='1'] | @*[.='1']" mode="toYesNo"/>Yes</xsl:template>
<xsl:template match="node()|@*" mode="toYesNo"/>
  <xsl:message terminate="no">The Yes/No value to be translated did not match expected input</xsl:message>
</xsl:template>

, а затем вы можете xsl:apply-templatesmode="toYesNo") выбрать любой элемент, атрибут или текстовый узел, чтобы получить соответствующее преобразование.

В XSLT 3.0 вы можете заменить шаблоны на m, например, match=".[.='0']" для соответствия любому виду узла.

Старайтесь избегать использования ./text(), потому что это не так, когда есть комментарии в вашем XML.Вы почти всегда можете заменить его на ..

И, конечно, ваша ошибка с атрибутами была ведущей //.Вам необходимо четко понимать разницу между выражениями абсолютного пути (которые начинаются с / и выбираются из корня дерева) и выражениями относительного пути (которые выбирают из узла, который вы обрабатываете в данный момент).

0 голосов
/ 30 ноября 2018

все значения Да или все значения Нет, в зависимости от значения в элементе первого узла

Да, конечно.Это потому, что ваш тест:

<xsl:when test="//@attribute='0'">

выбирает все атрибуты в документе XML, а в XSLT 1.0 (который, как я полагаю, вы используете) будет использоваться только первое значение.


Сначала вы должны быть в контексте element, а затем проверить атрибут этого конкретного элемента с помощью:

<xsl:when test="@attribute='0'">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...