2014-11-04 3 views
1

У меня есть XML, как показано ниже. Я хочу «записать», если хотите, xml, основанный на авторах. Поэтому для каждого дочернего узла автора я хочу получить полную копию всего xml и только один дочерний узел автора для каждой копии. Я подошел близко, но генерировать авторы правильно меня подвешивает. Любая помощь приветствуется!Скопируйте XML для каждого конкретного дочернего узла, сохраняя одну полную копию для каждого дочернего узла с помощью XSLT?

SAMPLE:

<root> 
    <book> 
     <name> 
     ... some data 
     </name> 
     <info> 
     ... some data 
     </info> 
     <authors> 
      <author> Author 1</author> 
      <author> Author 2</author> 
     </authors> 
     other nodes 
     . 
    </book> 
</root> 
======================= 
OUTPUT: 
<root> 
    <book> 
     <name> 
     ... some data 
     </name> 
     <info> 
     ... some data 
     </info> 
     <authors> 
      <author>Author 1</author> 
     </authors> 
     other nodes 
     . 
    </book> 
</root> 

<root> 
    <book> 
     <name> 
     ... some data 
     </name> 
     <info> 
     ... some data 
     </info> 
     <authors> 
      <author>Author 2</author> 
     </authors> 
     other nodes 
     . 
    </book> 
</root> 

ответ

1

Это не совсем тривиально - попробуйте:

XSLT 1.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:strip-space elements="*"/> 

<xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:for-each select="book/authors/author"> 
      <xsl:apply-templates select="ancestor::book"> 
       <xsl:with-param name="author" select="."/> 
      </xsl:apply-templates> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:param name="author"/> 
    <xsl:copy> 
     <xsl:apply-templates select="node()"> 
      <xsl:with-param name="author" select="$author"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="author"> 
    <xsl:param name="author"/> 
    <xsl:if test=".=$author"> 
     <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

Примечание: если вы можете использовать процессор XSLT 2.0, читать на туннелирование параметров; что сделает это немного менее сложным.

+0

Это работает, я ценю это. Я расскажу вам о туннелировании параметров. – Scott

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