2017-08-02 50 views
-2

移動標籤的部分是否可以通過XSL轉換這樣通過XSL

<tag name="a"/> 
<something> 
    <endtag name="a"/> 
    <tag name="b"/> 
</something> 
<endtag name="b"/> 

變換東西這個

<something> 
    <tag name="a"/> 
    <endtag name="a"/> 
    <tag name="b"/> 
    <endtag name="b"/> 
</something> 

?所以我知道<something>可能會或可能不會在相應的<tag><endtag>之間得到,這是不好的,我必須將其移動。

UPD: 更多信息。假設我們有一個輸入xml,它有3種類型的標籤:<tag>,<endtag><something>。我們的目標是改變它的方式,例如,每個,例如,<tag name="a"/>變爲<a>,<endtag name="a"/>變成</a><something>只是保持<something>。因此,與第一塊XML的,我只要它會導致不正確的XML,正是這樣:

<a> 
<something> 
    </a> 
    <b> 
</something> 
</b> 

所以我需要做一些準備工作並移動<something>的方式,它拓寬了,有它們都是<tag><endtag>,而不僅僅是其中的一個。

UPD 2: 1)我們有什麼 2)需要什麼

+0

恐怕您的問題沒有明確定義和例子是模糊的。請解釋需要在此處應用的確切規則。看到最小但**完整的** XML輸入和輸出也將有所幫助。如果您有兩種可能的情況,請爲兩者顯示示例。 –

+0

@ michael.hor257k已更新 –

+1

** 1。**您不能使用XSLT生成不合格的XML文檔。 - ** 2。**你添加的解釋聽起來像是你想**組**在'tag'和'endtag'之間的元素。如果您使用XSLT 2.0,那很容易,您可以在這裏找到許多類似的示例。我不會發表任何答案,因爲(a)您仍然沒有提供我們可以合作的意見,(b)我仍然主要猜測這裏的目的是什麼。 –

回答

0

我只需要移動第一先前和第一其後的兄弟姐妹

請看下面的例子:

XML

<root> 
    <tag name="a"/> 
    <tag name="b"/> 
    <something> 
     <endtag name="c"/> 
     <tag name="d"/> 
    </something> 
    <endtag name="e"/> 
    <endtag name="f"/> 
</root> 

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

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

<xsl:template match="something"> 
    <xsl:copy> 
     <xsl:copy-of select="preceding-sibling::tag[1]"/> 
     <xsl:apply-templates/> 
     <xsl:copy-of select="following-sibling::endtag[1]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="tag[following-sibling::*[1][self::something]] | endtag[preceding-sibling::*[1][self::something]]"/> 

</xsl:stylesheet> 

結果

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <tag name="a"/> 
    <something> 
    <tag name="b"/> 
    <endtag name="c"/> 
    <tag name="d"/> 
    <endtag name="e"/> 
    </something> 
    <endtag name="f"/> 
</root>