2016-07-05 41 views
1

XSLT的新功能。我有一個xml,看起來像 -基於子節點索引的XSLT映射

<?xml version="1.0" encoding="UTF-8"?> 
    <Parent> 
     <Child1> 
            <A>ContentAC1</A> 
            <B>ContentBC1</B> 
            <C>ContentCC1</C> 
        </Child1> 
        <Child2> 
            <A>ContentAC2</A> 
            <B>ContentBC2</B> 
            <C>ContentCC2</C> 
        </Child2> 
        <Child3> 
            <A>ContentAC3</A> 
            <B>ContentBC3</B> 
            <C>ContentCC3</C> 
        </Child3> 
     <Child4> 
            <A>ContentAC4</A> 
            <B>ContentBC4</B> 
            <C>ContentCC4</C> 
        </Child4> 
     ... 
    </Parent> 

我想根據條件創建XSLT映射。如果兒童的節點數< = 3,我想映射XML的樣子 -

<Children> 
     <C1A>ContentAC1</C1A> 
     <C1B>ContentBC1</C1B> 
     <C1C>ContentCC1</C1C> 
     <C2A>ContentAC2</C2A> 
     <C2B>ContentBC2</C2B> 
     <C2C>ContentCC2</C2C> 
     <C3A>ContentAC3</C3A> 
     <C3B>ContentBC3</C3B> 
     <C3C>ContentCC3</C3C> 
    </Children> 

如果子節點> 3的數,child3後,每個孩子都應該被映射到C3A,C3B和C3C。例如:如果子節點= 5,映射的xml應該看起來像:

 <Children> 
     <C1A>ContentAC1</C1A> 
     <C1B>ContentBC1</C1B> 
     <C1C>ContentCC1</C1C> 

     <C2A>ContentAC2</C2A> 
     <C2B>ContentBC2</C2B> 
     <C2C>ContentCC2</C2C> 

     <C3A>ContentAC3</C3A> 
     <C3B>ContentBC3</C3B> 
     <C3C>ContentCC3</C3C> 

     <C3A>ContentAC3</C3A> 
     <C3B>ContentBC3</C3B> 
     <C3C>ContentCC3</C3C> 

     <C3A>ContentAC3</C3A> 
     <C3B>ContentBC3</C3B> 
     <C3C>ContentCC3</C3C> 
     </Children> 

如何使用XSLT實現此目的?

+0

這兩個結果之間的區別是什麼 - 除了分離原始組的非重要空行之外? - P.S.請在您的輸入中添加一個根元素,使其成爲格式良好的XML。 –

+0

@ michael.hor257k目的就像你說的那樣。根據孩子的索引更改孩子姓名並分隔原始組。我能夠使用position()獲取當前的孩子索引,並且使用xsl:根據索引選擇map。但是,這組所有的C1A,C2A,C3A ...然後C1B,C2B,C3B ...但我想要保留相同的順序。即C1A,C1B,C1C然後是C2A,C2B,C2C等 – eechpeech

回答

0

重命名孫輩很容易,但我認爲你會發現控制輸出的空白不是那麼簡單,如果可能的話。

在我試過的所有處理器中,Saxon 6.5.5 was the only one to produce the separators

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:template match="/Parent"> 
    <xsl:variable name="count-children" select="count(*)" /> 
    <Children> 
     <xsl:for-each select="*"> 
      <xsl:variable name="i" select="position()"/> 
      <xsl:for-each select="A | B | C"> 
       <xsl:element name="{concat('C', $i, name())}"> 
        <xsl:value-of select="."/> 
       </xsl:element> 
      </xsl:for-each> 
      <xsl:if test="$count-children > 3 and $i!=last()"> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
    </Children> 
</xsl:template> 

</xsl:stylesheet> 

Here的,與撒克遜9.5和Xalan作品修改 - 但不是用的libxslt。

+0

謝謝!我修改它以保留內容和元素名稱,如果兒童人數> 3。 – eechpeech