Получение узла путем сопоставления имени другого узла или исключения узла путем сопоставления с другим узлом - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий XML

  <section>
            <object>
                <field name="First Source" />
                <tableSection 
                        propertyCount="1"
                        rowCount="1">
                    <tableProperty height="0"
                            width="570"
                            visible="true">
                        <property name="commit" />
                    </tableProperty>
                    <tableRow height="0"
                            width="0">
                        <tableCell value="Value First Source" />    
                    </tableRow>
                </tableSection>
            </object>
            <object>
                <field name="Another Source" />
                <tableSection 
                        propertyCount="1"
                        rowCount="1">
                    <tableProperty height="0"
                            width="570"
                            visible="true">
                        <property name="commit" />
                    </tableProperty>    
                    <tableRow height="0"
                            width="0">
                        <tableCell value="Invalid Value" />
                    </tableRow>
                </tableSection>
            </object>
        </section>

, и у меня есть xslt следующим образом

<xsl:template match="tableRow">
    <xsl:variable name="rowNodePosition">
        <xsl:value-of select="position()"/>
    </xsl:variable>
    <tr allowDblCl="true"  valign="top"  height="50px">
        <td>
            <b>Row:</b>
            <xsl:value-of select="$rowNodePosition"/>
            <br/>
            <xsl:for-each select="tableCell" >

                <xsl:variable name="currPosition">
                    <xsl:value-of select="position()"/>
                </xsl:variable>                 
                <xsl:if test="@value != ''">
                    <b>
                        <xsl:value-of select="../../tableProperty[position() = $currPosition]/property/@name"/>: </b>
                    <xsl:value-of select="@value"/>
                    <br/>
                </xsl:if>
            </xsl:for-each>
        </td>
    </tr>
    <tr>
        <td colspan="4" height="15px"> </td>
    </tr>
</xsl:template>

Это получит все 'tablRow'.Но мне нужно исключить tableRows с полем name = 'Another Source', т.е. если у узла объекта есть 'field' с именем "Another Source", то исключить tableRow узла tableSection

Node hierarchy

1 Ответ

0 голосов
/ 07 октября 2018

Как вы писали, вы хотите исключить каждый элемент tableRow с соответствующим именем поля с определенным значением.

Если вы хотите исключить какой-либо элемент в XSLT, общее правило заключается в записи пустой шаблон для этого элемента.

Имя этого элемента: tableRow , но для сужения соответствия необходимо добавить следующий предикат:

  • Перемещение на 2 уровня вверх (до уровня объект ).
  • Сход к дочернему элементу поле .
  • Снижениек атрибуту name .
  • Проверьте, является ли его содержимое Другой источник .

Итак, добавьте:

<xsl:template match="tableRow[../../field/@name = 'Another Source']"/>

к вашему XSLT-скрипту, чтобы достичь того, что вы хотите.

Рабочий пример см. http://xsltransform.net/ei5PwjS

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