2016-02-20 4 views
0

Это еще один вопрос, что я отправил на xslt move node inside sibling nodeXSLT перемещение узла внутри родственный узла части 2

Это мой вход:

<div class="a" >aaa 
    <div class="b">b1</div> 
    <div class="c">b1c1</div> 
    <div class="d">b1d1</div> 
    <div class="d">b1d2</div> 
    <div class="b">b2</div> 
    <div class="c">b2c1</div> 
    <div class="d">b2d1</div> 
    <div class="d">b2d2</div> 
    <div class="d">b2d3</div> 
    <div class="b">b3</div> 
    <div class="c">b3c1</div> 
    <div class="d">b3d1</div> 
</div> 

и это выход, я хотел бы получить:

<div class="a" >aaa 
    <div class="b">b1 
    <div class="c">b1c1</div> 
    <div class="d">b1d1</div> 
    <div class="d">b1d2</div> 
    </div> 
    <div class="b">b2 
    <div class="c">b2c1</div> 
    <div class="d">b2d1</div> 
    <div class="d">b2d2</div> 
    <div class="d">b2d3</div> 
    </div> 
    <div class="b">b3 
    <div class="c">b3c1</div> 
    <div class="d">b3d1</div> 
    </div> 
</div> 

Единственное отличие от предыдущей проблемы заключается в том, что имеет значение, то есть aaa.

Я использую следующие: XSLT

<?xml version="1.0"?> 
<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:key name="b" match="div[@class!='b']" use="generate-id(preceding-sibling::div[@class='b'][1])" /> 

<!-- Identity template, copies everything as is --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Override for target element --> 
<xsl:template match="div[@class='a']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|div[@class='b']"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@class='b']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    <xsl:apply-templates select="key('b', generate-id())" /> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Но это дает мне следующий результат, то есть "ааа" (после того, как класс деления = "а") исчез :(

<div class="a" > 
    <div class="b">b1 
    <div class="c">b1c1</div> 
    <div class="d">b1d1</div> 
    <div class="d">b1d2</div> 
    </div> 
    <div class="b">b2 
    <div class="c">b2c1</div> 
    <div class="d">b2d1</div> 
    <div class="d">b2d2</div> 
    <div class="d">b2d3</div> 
    </div> 
    <div class="b">b3 
    <div class="c">b3c1</div> 
    <div class="d">b3d1</div> 
    </div> 
</div> 

что я делаю неправильно? Я благодарю вас за вашу помощь.

ответ

1

проблемы с этой линией, в шаблоне, который соответствует "div[@class='a']"

<xsl:apply-templates select="@*|div[@class='b']"/> 

Этот атрибут select и divs с классом «b», но он не выбирает ничего другого, включая текстовые узлы. Заменить его с этим, чтобы выбрать ваш «ааа» Текст

<xsl:apply-templates select="@*|text()|div[@class='b']"/> 

С другой стороны, это также будет работать

<xsl:apply-templates select="@*|node() except div[@class !='b']"/> 
+0

Еще раз спасибо Тим! Я изучаю все xslt на примере, только за последнюю неделю. Я должен, возможно, прочитать хорошую книгу или веб-сайт по этому поводу. У вас есть рекомендации для меня? PS Я пытаюсь проголосовать за ваши ответы, но я получаю сообщение о том, что моя «репутация» по-прежнему слишком низка для моих голосов:/ – Yalmar

+0

Хотя вопрос закрыт (потому что, строго говоря, тема для StackOverflow), вы можете посмотреть http://stackoverflow.com/questions/3511759/where-can-i-find-a-good-tutorial-on-xslt-files, так как содержит ссылку на номер ресурсов и рекомендаций для книг. –

+0

Спасибо Тим. Я посмотрю на это. – Yalmar

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