Выберите дочерние узлы, используя XSLT - PullRequest
2 голосов
/ 03 апреля 2012

Что такое оператор xslt select для преобразования xml из

<A>
  <B id="x">
    <C>
      <D>
      <D>
      <D>
      <D>
    </C>
  </B>
</A>

до

<C name = "x">
  <D>
  <D>
  <D>
  <D>
</C>

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

Вот краткое и простое, полное решение :

<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="B[@id]/C">
  <C name="{../@id}">
    <xsl:copy-of select="node()"/>
  </C>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):

<A>
    <B id="x">
        <C>
            <D/>
            <D/>
            <D/>
            <D/>
        </C>
    </B>
</A>

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

<C name="x">
   <D/>
   <D/>
   <D/>
   <D/>
</C>

Объяснение

  1. Правильное использование сопоставления шаблонов.

  2. Использование AVT .

0 голосов
/ 03 апреля 2012

Я бы пошел на

<?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" version="1.0" encoding="UTF-8" indent="yes"/>

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

    <xsl:template match="C">
        <xsl:copy>
            <xsl:attribute name="name"><xsl:value-of select="../@id"></xsl:value-of></xsl:attribute>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

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

    <xsl:template match="A|B">
            <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

Что преобразует

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <B id="x">
        <C>
            <D/>
            <D/>
            <D/>
            <D/>
        </C>
    </B>
</A>

в

<?xml version="1.0" encoding="UTF-8"?>
<out>
    <C name="x">
        <D/>
        <D/>
        <D/>
        <D/>
    </C>
</out>
0 голосов
/ 03 апреля 2012

С ., являющимся C:

<xsl:copy>
  <xsl:attribute name="name">
    <xsl:value-of select="../@id"/>
  </xsl:attribute>
  <xsl:copy-of select="*"/>
</xsl:copy>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...