2013-04-22 4 views
1

Ниже представлена ​​структура моего XML.создание копии родительского узла по размеру дочернего узла в xslt

<Client> 
    <Document> 
    <service class="ABC"> 
     <author name="p"/> 
     <title>t1</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="XYZ"> 
     <author name="a"/> 
     <title>t2</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="PQR"> 
     <author name="x"/> 
     <title>t3</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
</Client> 

Я хочу создать копию узла документа, у которого есть заголовок как 't2', но не в состоянии определить решение. Выход должен выглядеть так:

<Client> 
    <Document> 
    <service class="ABC"> 
     <author name="p"/> 
     <title>t1</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="XYZ"> 
     <author name="a"/> 
     <title>t2</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="PQR"> 
     <author name="x"/> 
     <title>t3</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="XYZ"> 
     <author name="a"/> 
     <title>t2</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
</Client> 

Благодарим за вашу помощь.

ответ

1

Этот простой таблицы стилей в один из способов сделать это:

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

    <!-- 
    Identity transform 
    See http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT 
    --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Override identity transform to process <Client> element --> 
    <xsl:template match="Client"> 
    <!-- Copy current element into output --> 
    <xsl:copy> 
     <!-- Apply attributes and child nodes --> 
     <xsl:apply-templates select="@* | node()"/> 
     <!-- Apply all <Document> elements with <title> whose value is "t2" --> 
     <xsl:apply-templates select="Document[service/title = 't2']"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
0

Предыдущий ответ был бы правильным, но для линии:

Выверенный правильная версия:

<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="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Override identity transform to process <Client> element --> 
<xsl:template match="Client"> 
    <!-- Copy current element into output --> 
    <xsl:copy> 
     <!-- Apply attributes and child nodes --> 
     <!-- Apply all <Document> elements with <title> whose value is "t2" --> 
     <xsl:apply-templates select="Document[service/title = 't2']"/> 
    </xsl:copy> 
</xsl:template> 

Выход:

<?xml version="1.0" encoding="utf-8"?> 
<Client> 
    <Document> 
     <service class="XYZ"> 
      <author name="a"/> 
      <title>t2</title> 
      <Details> 
       ... 
      </Details> 
     </service> 
    </Document> 
</Client> 
+0

Вы сказали: «Было бы правильно, но для строки:', но вы не указали, какую линию вы считали неправильной. Я предполагаю, что это '', потому что это единственное различие, которое я вижу. Однако, удалив эту строку, ваш результат теперь отличается от того, что было запрошено OP. См. «Результат должен выглядеть так» в исходном вопросе. –

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