xslt - интерполяция нескольких переменных, непосредственно смежных - PullRequest
0 голосов
/ 28 февраля 2019

это должен быть простой вопрос, но мне не повезло в нескольких экспериментах.

Я использую XSLT для преобразования XML в CSV.У меня есть ключевые элементы вывода, определенные как переменные, таким образом -

<xsl:variable name="sep" select='"&#9;"' />
<xsl:variable name="crlf" select='"&#13;&#10;"' />
<xsl:variable name="lf" select='"&#10;"' />

Входной XML выглядит следующим образом -

<unit>
    <def>60 s</def>
    <name><singular>minute</singular></name>
    <symbol>min</symbol>
    <definition>period of time equal to 60 seconds</definition>
</unit>

Некоторые единицы имеют имена как единственного, так и множественного числа, некоторые имеют только однои у некоторых нет имени (странно, но это то, с чем мне приходится иметь дело).

Когда я обнаруживаю единицу без элемента <name>, мне нужно вывести два пустых столбца (два разделителя) в CSV.

В этом фрагменте XSLT-

    <xsl:choose>
        <xsl:when test="name">
            <xsl:apply-templates select="name" />
            <xsl:value-of select="$sep" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$sep" />
            <xsl:value-of select="$sep" />
        </xsl:otherwise>
    </xsl:choose>

, имеющем два отдельных оператора <xsl:value-of select="$sep" />, работает, но он кажется многословным.Есть ли более аккуратный способ?

Использование <xsl:value-of select="$sep$sep" /> не работает.Также не используется $sep$sep непосредственно в предложении иначе или встраивается в элемент xsl: text.

Является ли синтаксический анализатор XSLT слишком ограниченным для интерполяции более чем одной переменной в строку или существует формулировкая пропускаю?

- ОБНОВЛЕНИЕ-- Мое чтение различных руководств xslt указывает на то, что синтаксис {$sep}{$sep} должен работать в литеральном теле элемента xsl: match, но он также не работает.

1 Ответ

0 голосов
/ 01 марта 2019

с двумя отдельными утверждениями работает, но кажется многословным.Есть ли более аккуратный способ?

Как я уже упоминал в комментарии к вашему вопросу, вы можете использовать:

<xsl:value-of select="concat($sep, $sep)" /> 

, но это не дает никаких реальных преимуществ.Напротив, это делает код менее читабельным - и некоторые (включая меня) сказали бы, что добавляют ненужные вычисления перед записью в вывод.

ИМХО, лучший способ упростить ваш код:

<xsl:choose>
    <xsl:when test="name">
        <xsl:apply-templates select="name" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$sep" />
    </xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$sep" />

, поскольку второй разделитель не зависит от условия.


--UPDATE-- Мое чтение различных руководств по xslt показывает, что синтаксис {$sep}{$sep} должен работать в литеральном теле элемента xsl: match, но это тоже не работает.

Получите лучшие материалы для чтения.{$sep}{$sep} - это синтаксис для шаблона значения атрибута .Поскольку вы выводите текст, он совершенно не имеет отношения к вашей ситуации.

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