2015-09-18 18 views
0

我是XSLT中的新成員,我需要根據屬性值刪除少數子節點,然後刪除其父節點(如果沒有子標記)在它下面。將一個xsl模板輸出傳遞給XSLT中的其他xsl模板輸入以進行進一步處理

例如示例XML輸入類型1:

<?xml version="1.0" encoding="UTF-8"?> 
<GrandFather> 
    <Father> 
     <Father-bro>Bro</Father-bro> 
     <Father-sis>Sis</Father-sis> 
     <Child name="real">Real Children</Child> 
     <Child name="fake">FakeChildren</Child> 
    </Father> 
</GrandFather> 

預期輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<GrandFather> 
    <Father> 
     <Father-bro>Bro</Father-bro> 
     <Father-sis>Sis</Father-sis> 
     <Child name="real">Real Children</Child> 
    </Father> 
</GrandFather> 

例如示例XML輸入類型2:

<?xml version="1.0" encoding="UTF-8"?> 
<GrandFather> 
    <Father> 
     <Father-bro>Bro</Father-bro> 
     <Father-sis>Sis</Father-sis> 
     <Child name="fake">Real Children</Child> 
     <Child name="fake">FakeChildren</Child> 
    </Father> 
</GrandFather> 

預期輸出:刪除父標籤,如果沒有name屬性的子標籤「假」,並刪除爺爺標籤如果根本沒有父親的標籤(如父標籤將會從早期的邏輯刪除)

<?xml version="1.0" encoding="UTF-8"?> 

要求:

如果孩子有標籤的「name」屬性值「假」,那麼我們就應該刪除特定的子標籤。所有子標籤都可以具有名稱屬性爲「假」或無。 之後檢查:

如果在父標籤下沒有子標籤,則還要刪除父標籤,或者只刪除名稱屬性爲「假」的子標籤,並將真實子標籤與其他標籤一起保存。

如果在祖父標記下沒有父親 標記,則刪除祖父標記。

我的代碼分佈研究: 我能寫XSL,這將刪除所有的子標籤,方含name屬性爲「假」。 但是,當我做同樣的父親或祖父標記,然後它不考慮被刪除的孩子xml(第一個xsl:模板的輸出),而是檢查與原始的xml模板。

我的XSL(這將刪除所有的孩子具有屬性名稱爲「假」),用於樣品輸入XML類型1,但是,當輸入類型是樣品輸入XML它不會覆蓋2

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output omit-xml-declaration="yes"/> 

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

    <xsl:template match="//Child[@name='fake']"/> 

</xsl:stylesheet> 

誰可以幫我這個事?

+0

http://stackoverflow.com/help/someone-answers –

回答

0

我相信你可以做到這一切在一個單一的通行證:

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="/"> 
    <xsl:apply-templates select="GrandFather[Father/Child[not(@name='fake')]]"/> 
</xsl:template> 

<xsl:template match="GrandFather"> 
    <xsl:copy> 
     <xsl:apply-templates select="Father[Child[not(@name='fake')]]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Child[@name='fake']"/> 

</xsl:stylesheet>