2017-02-03 2 views
0

Извините за вводящий в заблуждение заголовок, но я не знаю лучшего выражения для него. Я пытаюсь создать XSL, который предоставляет два разных основных раздела в моем выходном XML для совершенно разных типов данных. Тем не менее, я всегда получаю BOTH типы данных в EACH-вызове шаблона. Надеюсь, вы можете дать мне подсказку, как этого добиться. Это мои ингредиенты:Отдельный вывод с XSL

Источник XML

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <books> 
     <book>Xpages</book> 
     <book>XML</book> 
    </books> 

    <dvds> 
     <dvd>Star Wars</dvd> 
     <dvd>Prometheus</dvd> 
    </dvds> 
</root> 

XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <media> 
      <xsl:element name="booklist"> 
       <xsl:call-template name="books"/> 
      </xsl:element> 
      <xsl:element name="dvdlist"> 
       <xsl:call-template name="dvds"/> 
      </xsl:element> 
     </media> 
    </xsl:template> 

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

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

    <xsl:template match="books/book" name="book"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 

    <xsl:template match="dvds/dvd" name="dvd"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 
</xsl:stylesheet> 

Это то, что я получаю

<?xml version="1.0" encoding="UTF-8"?> 
<media> 
    <booklist> 
     Xpages 
     XML  
     Star Wars 
     Prometheus  
    </booklist> 
    <dvdlist> 
     Xpages 
     XML  
     Star Wars 
     Prometheus 
    </dvdlist> 
</media> 

Но это то, что я хочу

<?xml version="1.0" encoding="UTF-8"?> 
<media> 
    <booklist> 
     Xpages 
     XML 
    </booklist> 
    <dvdlist> 
     Star Wars 
     Prometheus 
    </dvdlist> 
</media> 

Как вы можете видеть, это удваивает мои 2 списка. Я думаю, это потому, что я использую шаблоны-шаблоны внутри двух шаблонов, но должен быть способ решить эту проблему. Любая помощь высоко ценится!

ответ

1

Вы начинаете с xsl:call-template, но в этом случае <xsl:apply-templates /> выберет все узлы. На этом этапе вы все еще находитесь на узле документа. Фактически происходит использование встроенных шаблонов XSLT, который сначала выбирает узел root, а затем, поскольку у вас нет шаблона для этого, он будет выбирать узлы books и dvds. .

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

Попробуйте XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <media> 
      <xsl:element name="booklist"> 
       <xsl:apply-templates select="root/books" /> 
      </xsl:element> 
      <xsl:element name="dvdlist"> 
       <xsl:apply-templates select="root/dvds" /> 
      </xsl:element> 
     </media> 
    </xsl:template> 

    <xsl:template match="books/book" name="book"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 

    <xsl:template match="dvds/dvd" name="dvd"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо! Не знал, что appy-templates также может иметь атрибут select. –

1

Одно из решений этого 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" /> 

    <xsl:template match="/root"> 
     <media> 
      <xsl:element name="booklist"> 
       <xsl:apply-templates select="books/book" /> 
      </xsl:element> 
      <xsl:element name="dvdlist"> 
       <xsl:apply-templates select="dvds/dvd" /> 
      </xsl:element> 
     </media> 
    </xsl:template> 

    <xsl:template match="book"> 
     <xsl:text>&#xa;</xsl:text><xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="dvd"> 
     <xsl:text>&#xa;</xsl:text><xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

Сво выход

<?xml version="1.0"?> 
<media><booklist> 
     Xpages 
     XML 
    </booklist> 
    <dvdlist> 
     Star Wars 
     Prometheus 
    </dvdlist> 
</media> 
+0

Спасибо - я поддержал ваш ответ, хотя я принял другой, потому что это было раньше ;-) –

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