2015-06-19 117 views
-2

我想用XSLT轉換XML結構。使用XSLT轉換XML結構

<detaileddescription> 
    <para>Some text</para> 
    <para> 
    <bold>Title</bold> 
    </para> 
    <para>Intro text: 
    <itemizedlist> 
    <listitem> 
     <para>Text</para> 
    </listitem> 
    <listitem> 
     <para>Text</para> 
    </listitem> 
    </itemizedlist> 
    </para> 
</detaileddescription> 

這就是我想要的:

<detaileddescription> 
    <para>Some text</para> 
    <List> 
    <Title>Title</Title> 
    <Intro> 
     Intro text: 
    </Intro 
    <ListItem> 
     <para>Text</para> 
    </ListItem> 
    <ListItem> 
     <para>Text</para> 
    </ListItem> 
    </List> 
</detaileddescription> 

所以在我自己的話說: 如果有<para><bold>,檢查<para>以下同胞也是<para>和有一個孩子<para>Text</para>比我想要重建的結構如圖所示。

我不確定是否有可能,因爲我剛開始使用xslt/xpath。任何人都可以給我一點幫助嗎?

+0

這個問題實在太廣泛而無法有效回答。花一點時間閱讀XSLT模板,以及'following-sibling ::'和'descendant ::'軸。也許你可以更具體地針對你遇到的問題重新制定它。 –

+0

好吧,你是對的。也許我的問題有點不確定。 起初我想爲此找到一個測試: 「元素A的第一個後續兄弟元素是一個具有子元素B的元素A」。 –

+1

'following-sibling :: * [1] [self :: A [B]]'檢查後面的第一個兄弟元素是否是至少有一個'B'元素子元素的'A'元素。請注意,在你的示例中,內部'para'不是外部'para'的孩子,它只是一個後代。 –

回答

1

如果你想使用節點條件的話,我會建議把它們放進匹配模式:

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

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="detaileddescription/para[bold][following-sibling::*[1][self::para[.//para]]]"> 
     <List> 
      <Title> 
       <xsl:value-of select="bold"/> 
      </Title> 
      <xsl:apply-templates select="following-sibling::*[1]" mode="intro-list"/> 
     </List> 
    </xsl:template> 

    <xsl:template match="detaileddescription/para[.//para][preceding-sibling::*[1][self::para[bold]]]"/> 

    <xsl:template match="detaileddescription/para/text()[1]" mode="intro-list"> 
     <Intro> 
      <xsl:value-of select="."/> 
     </Intro> 
    </xsl:template> 

    <xsl:template match="listitem" mode="intro-list"> 
     <ListItem> 
      <xsl:apply-templates/> 
     </ListItem> 
    </xsl:template> 
</xsl:transform> 

的樣本見http://xsltransform.net/3NzcBtK/2

+0

非常感謝。這對我很有幫助。 –