XSL: выбор данных из узла на основе значения переменной - PullRequest
0 голосов
/ 09 июня 2011

Я работаю над небольшим проектом, изучающим XSL, и столкнулся с проблемой ...

У меня есть файл Docbook с серией действий для людей, классифицированных по Департаменту.Однако иногда у меня будет человек, который работает в малой группе, а также в своей собственной.Чтобы избежать дублирования данных, я указал, что узел человека либо содержит данные в своем узле, либо узел внешней ссылки, который ссылается на его основной узел.Когда я перебираю всех людей в группе, мне нужно проверить, является ли этот узел связанным узлом или узлом данных, и соответствующим образом скорректировать мои переменные.

Вот код выбора

<xsl:choose>
    <xsl:when test="xref">
        <xsl:variable name="TAG_ID" select="xref/@linkend" />
        <xsl:variable name="NAME" select="//*[@id='$TAG_ID']/para[@id='who']" />
        <xsl:variable name="EMAIL" select="//*[@id='$TAG_ID']/para[@id='who']/ulink/@url" />
        <xsl:variable name="IMAGE" select="//*[@id='$TAG_ID']/para[@id='image']" />
        <xsl:variable name="MEET" select="//*[@id='$TAG_ID']/para[@id='meet']" />
        <xsl:call-template name="output_person" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="NAME" select="para[@id ='who']" />
        <xsl:variable name="EMAIL" select="para[@id='who']/ulink/@url" />
        <xsl:variable name="IMAGE" select="para [@id='image']" />
        <xsl:variable name="MEET" select="para [@id='meet']" />
        <xsl:call-template name="output_person" />
    </xsl:otherwise>
</xsl:choose>

Однако, когда я пытаюсь запустить это, я получаю следующие ошибки ...

runtime error: file team.xsl line 92 element img
Variable 'IMAGE' has not been declared.
xmlXPathCompiledEval: evaluation failed

После некоторых поисков в Интернете я одновременно видел код, который выполняет это, и люди говорят, что это невозможно.

Итак, мой вопрос двоякий ...

Могу ли я выбрать конкретный узел на основе переменной?

и если нет, то можно ли это сделать?

1 Ответ

1 голос
/ 09 июня 2011

Переменные, которые вы объявляете, не попадут в область действия вашего шаблона output_person. Чтобы это работало, необходимо, чтобы шаблон output_person принимал параметры, а затем передавал эти параметры как часть call-template .

Также обратите внимание, что ссылки на переменные не должны быть заключены в кавычки.

Например:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- other templates -->
<xsl:template match="your-element">
    <xsl:choose>
        <xsl:when test="xref">
            <xsl:variable name="TAG_ID" select="xref/@linkend" />
            <xsl:variable name="NAME" select="//*[@id=$TAG_ID]/para[@id='who']" />
            <xsl:variable name="EMAIL" select="//*[@id=$TAG_ID]/para[@id='who']/ulink/@url" />
            <xsl:variable name="IMAGE" select="//*[@id=$TAG_ID]/para[@id='image']" />
            <xsl:variable name="MEET" select="//*[@id=$TAG_ID]/para[@id='meet']" />
            <xsl:call-template name="output_person">
               <xsl:with-param name="NAME" select="$NAME"/> 
                <xsl:with-param name="EMAIL" select="$EMAIL"/> 
                <xsl:with-param name="IMAGE" select="$IMAGE"/> 
                <xsl:with-param name="MEET" select="$MEET"/> 
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="NAME" select="para[@id ='who']" />
            <xsl:variable name="EMAIL" select="para[@id='who']/ulink/@url" />
            <xsl:variable name="IMAGE" select="para [@id='image']" />
            <xsl:variable name="MEET" select="para [@id='meet']" />
            <xsl:call-template name="output_person">
                <xsl:with-param name="NAME" select="$NAME"/> 
                <xsl:with-param name="EMAIL" select="$EMAIL"/> 
                <xsl:with-param name="IMAGE" select="$IMAGE"/> 
                <xsl:with-param name="MEET" select="$MEET"/> 
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
<xsl:template name="output_person">
    <xsl:param name="NAME"/>
    <xsl:param name="EMAIL"/>
    <xsl:param name="IMAGE"/>
    <xsl:param name="MEET"/>
    <!-- your logic here -->
</xsl:template>

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