2012-05-24 69 views
3

我需要這種結構如何什麼是使用XSLT-1.0最佳的解決方案使用XSLT的1.0

<A> 
<B>value1</B> 
</A> 
<A> 
<B>value2</B> 
</A> 

變成

<A> 
<B>value1<B> 
<B>value2<B> 
</A> 

轉換XML結構? 謝謝!

PS:我想這個代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:key name="group_a" match="//A" use="B"/> 
<xsl:template match="/Test"> <a-node> <xsl:for-each select="//A"> <b-node> 
<xsl:value-of select="//A/B"/> </b-node> </xsl:for-each> </a-node> 
</xsl:template> 
</xsl:stylesheet> 

但只返回第一個值:

<?xml version="1.0" encoding="utf-8"?> <a-node mlns:fo="http://www.w3.org/1999/XSL/Format"> <b-node>value1</b-node> <b-node>value1</b-node> </a-node> 

,但我需要:

<?xml version="1.0" encoding="utf-8"?> <a-node xmlns:fo="http://www.w3.org/1999/XSL/Format"> <b-node>value1</b-node> <b-node>value2</b-node> </a-node> 

回答

1

因爲它似乎你需要崩潰所有的孩子在一個單一的節點下,那麼你不需要關於「A」的foreach,你可以直接移動到「B」兒童

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
     <A> 
      <xsl:for-each select="//A/B"> 
       <B> 
        <xsl:value-of select="./text()"/> 
       </B> 
      </xsl:for-each> 
     </A> 
    </xsl:template> 
</xsl:stylesheet> 

編輯按@肖恩的評論,請注意//不應該在現實生活中使用。將//替換爲實際根元素的路徑。

+0

功能正確但效率低下。最好使用模板樣式並避免不必要的//操作符的使用。 –

+0

@Sean - 確實 - 同意永遠不會使用//但自OP的xml示例沒有根元素以來沒有選擇:) – StuartLC

2

這個樣式表...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
     <A> 
     <xsl:apply-templates select="*/A/B"/> 
     </A> 
    </xsl:template> 

    <xsl:template match="B"> 
     <B><xsl:value-of select="."/></B> 
    </xsl:template> 
</xsl:stylesheet> 

...將變換...

<root> 
<A> 
<B>value1</B> 
</A> 
<A> 
<B>value2</B> 
</A> 
</root> 

...這個...

<A><B>value1</B><B>value2</B></A> 
0

這轉換使用了最基本的XSLT設計模式之一 - 覆蓋身份轉換。因此,它更容易編寫,理解,維護和擴展

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

<xsl:template match="A[1]"> 
    <A> 
    <xsl:apply-templates select="node()|following-sibling::A/node()"/> 
    </A> 
</xsl:template> 
<xsl:template match="A"/> 
</xsl:stylesheet> 

當施加於下面的XML文檔(通過包裝提供的XML片段到單個頂部元件獲得這種轉化 - 到使這是一個良好的XML文檔):

<t> 
    <A> 
     <B>value1</B> 
    </A> 
    <A> 
     <B>value2</B> 
    </A> 
</t> 

想要的,正確的結果產生:

<t> 
    <A> 
     <B>value1</B> 
     <B>value2</B> 
    </A> 
</t> 
相關問題