XSL Пропускающий Детский Элемент - PullRequest
0 голосов
/ 07 июля 2010

Я хочу пропустить дочерний элемент из следующего xml

<person id="101">
    <name>XYZ</name>
    <last-name>XXX</last-name>
</person>
<person id="101">
    <name>YYY</name>
    <last-name>BBB</last-name>
</person>

Если я хочу пропустить фамилию и вот мой код

<xsl:template match="/">
   <xsl:apply-templates select="//person [not(last-name)]" />
</xsl:template>
<xsl:template match="person">
<xsl:copy-of select="." />
<xsl:text>&#xa;</xsl:text>
</xsl:template>

Приведенный выше код пропускает элемент all person, имеющий элемент last-name.

Может ли кто-нибудь помочь мне с этим кодом?

Спасибо

Ответы [ 2 ]

1 голос
/ 07 июля 2010

При правильном вводе:

<root>
    <person id="101">
        <name>XYZ</name>
        <last-name>XXX</last-name>
    </person>
    <person id="101">
        <name>YYY</name>
        <last-name>BBB</last-name>
    </person>
</root>

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
   <xsl:apply-templates select="@*|node()" />
   </xsl:copy>
</xsl:template>
<xsl:template match="last-name"/>
</xsl:stylesheet>

Произведите, как мне кажется, желаемый результат:

<root>
    <person id="101">
        <name>XYZ</name>
    </person>
    <person id="101">
        <name>YYY</name>
    </person>
</root>

Примечание : преобразование идентичности. Пустой шаблон для удаления узлов.

1 голос
/ 07 июля 2010

Под "пропуском фамилии" я так понимаю, вы хотите, чтобы ваш вывод выглядел так:

<person id="101">
  <name>XYZ</name>
</person>
<person id="101">
  <name>YYY</name>
</person>

В этом случае ваш подход должен включать все элементы person. Стандартный способ копирования всего, кроме определенного элемента, работает следующим образом:

<xsl:template match="/">
  <xsl:apply-templates select="//person"/>
</xsl:template>
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="last-name">
  <!-- Do nothing, you don't want to copy this. -->
</xsl:template>

Я думаю, вы неправильно понимаете, как работают выражения XPath. Ваше выражение //person [not(last-name)] выбирает все элементы person, соответствующие условию not(last-name), что означает, что оно соответствует любым элементам person, которые не имеют дочерних элементов last-name. Он ведет себя именно так, как и должен.

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