Как отобразить первого ребенка только с XSL - PullRequest
2 голосов
/ 20 декабря 2011

в настоящее время я получаю это

<root>
<event>bla</event>
</root>

Что я хочу, это только это

<event>bla</event>

Мой xsl выглядит так

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:param name="Number" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="/root/event" />
<xsl:template match="/root/event[1]">
<xsl:copy-of select="current()" />
</xsl:template>
</xsl:stylesheet>

Я могу 't выяснить, как получить доступ к первому узлу, не переходя сначала через / root.Просьба помочь

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

Этот XSLT должен ответить на ваш вопрос. Это даст event элементов, которые являются первыми дочерними элементами их родительского узла:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
    <xsl:template match="*">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="event[1]">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

Элемент root пропускается шаблоном match="*".

Другой способ сделать это (более простой, но менее эволюционный):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
    <xsl:template match="/">
        <xsl:copy-of select="root/event[1]"/>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 20 декабря 2011

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

0,1. Переопределение, которое исключает элемент, но обрабатывает все узлы в его поддереве:

<xsl:template match="root">
  <xsl:apply-templates/>
</xsl:template>

0,2. Переопределить для элемента, который исключает его и любой узел из его поддерева:

 <xsl:template match="event[position() > 1]"/>

Эти два вместе дают нам полное требуемое преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="root">
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="event[position() > 1]"/>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<root>
    <event>bla1</event>
    <event>bla2</event>
</root>

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

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