2010-07-07 4 views
0

Я хочу, чтобы пропустить дочерний элемент из следующих XMLXSL Skipping Детский Элемент

<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> 

Приведенный выше код пропускает все человека, который имеет последний элемент.

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

Благодаря

ответ

1

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

<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> 

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

+0

Спасибо. Отлично работает! – Maximus

+0

@ jason4: Ты добрый! Кроме того, чтобы помочь другим, отредактируйте свой вопрос и уточните, что вы хотите удалить элемент 'last-name'. – 2010-07-08 13:59:28

1

К «пропустить фамилию» Я понимаю, что вы хотите, чтобы ваш выход выглядеть следующим образом:

<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 элементов. Он ведет себя так, как должен.

+0

Пожалуйста, не рекомендуйте выражения, начинающиеся с '//', потому что они очень неэффективны. – 2010-07-07 14:51:27

Смежные вопросы