Условно присваивайте переменную для соответствия пути в шаблоне xslt - PullRequest
0 голосов
/ 24 января 2019

Я хочу динамически построить соответствие в шаблоне xslt.Я использую xls fo и apache fop и saxon9he.В лучшем случае я хочу передать параметр из Java, но сначала я пытаюсь установить это в xslt.

Когда я создаю пример переменной, как это:

<xsl:variable name="testPath" select="/abc:Files/def:Description" /> 

также работает правильно, если я пытаюсь использовать этов apply-templates:

<xsl:apply-templates select="$testPath/qwe:Test"/>

Но я хочу динамически установить переменную testPath.Я пытаюсь использовать выбор тега:

<xsl:variable name="testPath"> 
    <xsl:choose>
        <xsl:when test="$versionNo = '2'">
             <xsl:value-of select="/abc:Files/def:Description" />   
        </xsl:when>
        <xsl:otherwise>
             <xsl:value-of select="/abc:Files/def:Names" /> 
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable> 

Но этот подход не работает, и когда я пытаюсь использовать эту переменную:

<xsl:apply-templates select="$testPath/qwe:Test"/>

Я получаю эту ошибку:

Ошибка оценки ((attr {table-layout = ...}, ...)) в строке 82 столбца 21 pdf_gen.xsl: SXCH0003: org.apache.fop.fo.ValidationException: "fo: table-body"отсутствует дочерние элементы.Требуемая модель содержимого: маркер * (строка таблицы + | ячейка таблицы +) (см. Позицию 82:21):
файл: / C: / Users / SuperUser / рабочая область / проект / xls-editor / target / classes / pdf /xsl / pdf_gen.xsl: 82: 21: в fo: table-body отсутствуют дочерние элементы.Требуемая модель содержимого: маркер * (таблица-строка + | таблица-ячейка +) (см. Позицию 82:21)

В лучшем случае я хочу передать переменную $ testPath из Java в качестве параметра, пример:

transformer.setParameter("testPath ", "/abc:Files/def:Description");

и использовать в xslt

<xsl:param name="testPath "/>

и применять в шаблонах:

<xsl:apply-templates select="$testPath/qwe:Test"/>

, но я получаю следующую ошибку:

Типоценка ошибки ($ testPath) в xsl: apply-templates / @ select в строке 74 столбца 60 pdf_gen.xsl: XPTY0019: Обязательным типом элемента первого операнда '/' является node ();предоставленное значение
u "/ abc: Files / def: Description" является атомарным значением

Почему не работает какое-либо решение, как его достичь?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Поскольку вы используете Saxon 9, вы используете хотя бы XSLT 2 с XPath 2, и там я бы предложил реализовать выбор переменных в XPath с помощью, например,

<xsl:variable name="testPath" select="if ($versionNo = '2') then /abc:Files/def:Description else /abc:Files/def:Names"/> 

Таким образом, ваш

<xsl:apply-templates select="$testPath/qwe:Test"/>

должен нормально работать для обработки qwe:Test дочерних элементов ранее выбранных def:Description или def:Names элементов.

Конечно, также можно использовать, например,

<xsl:apply-templates select="(if ($versionNo = '2') then /abc:Files/def:Description else /abc:Files/def:Names)/qwe:Test"/>

или, например,

<xsl:apply-templates select="(/abc:Files/def:Description[$versionNo = '2'], /abc:Files/def:Names[$versionNo != '2'])/qwe:Test"/>
0 голосов
/ 24 января 2019

Я имею дело с подобной проблемой.Мне кажется, что видимость переменных находится только внутри блока <xsl:choose>, и я мог бы предложить вам создать блоки шаблонов и вызывать их следующим образом:

<xsl:choose>
    <xsl:when test="$versionNo = '2'" >
        <xsl:call-template name="TemplateOne">
            <xsl:with-param name="testPath" select="'/abc:Files/def:Description'" />
        </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
        <xsl:call-template name="TemplateTwo">
            <xsl:with-param name="testPath" select="'/abc:Files/def:Names'" />
        </xsl:call-template>
    </xsl:otherwise>
</xsl:choose>

с определением шаблонов как:

<xsl:template name="TemplateOne">
    <xsl:param name="testPath" />
    ...
    bla bla bla
    remember to use variable in this template as "{$testPath}"
    ...
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...