2012-06-25 39 views
0

我想通過使用xslt將一個xml格式轉換爲另一種指定的格式。這是我的Xml文件。我必須通過在xslt中使用某種類型的遞歸調用來創建一些動態xml元素。如何使用xslt中的遞歸函數調用創建動態xml元素?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
<w:body> 
    <w:p> 
     <w:pPr> 
     </w:pPr> 
     <w:r> 
      <w:t>Text1-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
      <w:pStyle w:val="Heading1" /> 
     </w:pPr> 
     <w:r> 
      <w:t>Text2-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
     </w:pPr> 
     <w:r> 
      <w:t>Text3-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
     </w:pPr> 
     <w:r> 
      <w:t>Text4-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
      <w:pStyle w:val="Heading2" /> 
     </w:pPr> 
     <w:r> 
      <w:t>Text5-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
     </w:pPr> 
     <w:r> 
      <w:t>Text6-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
      <w:pStyle w:val="Heading3" /> 
     </w:pPr> 
     <w:r> 
      <w:t>Text7-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
     </w:pPr> 
     <w:r> 
      <w:t>Text8-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
      <w:pStyle w:val="Heading1" /> 
     </w:pPr> 
     <w:r> 
      <w:t>Text9-</w:t> 
     </w:r> 
    </w:p> 

    <w:p> 
     <w:pPr> 
     </w:pPr> 
     <w:r> 
      <w:t>Text10-</w:t> 
     </w:r> 
    </w:p> 


</w:body> 
</w:document> 

而我需要的輸出XML是:

<Document> 
     <Paragraph>Text1-</Paragraph> 
     <Heading1> 
     <Title>Text2-</Title> 
     <Paragraph>Text3-</Paragraph> 
     <Paragraph>Text4-</Paragraph> 
     <Heading2> 
      <Title>Text5-</Title> 
      <Paragraph>Text6-</Paragraph> 
      <Heading3> 
       <Title>Text7-</Title> 
       <Paragraph>Text8-</Paragraph> 
      </Heading3>   
     </Heading2> 
     <Heading1> 
     <Heading1> 
     <Title>Text9-</Title> 
     <Paragraph>Text10-</Paragraph> 
     <Heading1>  
</Document> 

請指導我的方式來擺脫這個問題...

回答

1

下面是一個簡單的樣式表:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xs w mf"> 

<xsl:output indent="yes"/> 

<xsl:function name="mf:group" as="element()*"> 
    <xsl:param name="paragraphs" as="element()*"/> 
    <xsl:param name="level" as="xs:integer"/> 
    <xsl:for-each-group select="$paragraphs" group-starting-with="p[pPr/pStyle/@w:val = concat('Heading', $level)]"> 
    <xsl:choose> 
     <xsl:when test="self::p[pPr/pStyle/@w:val = concat('Heading', $level)]"> 
     <xsl:element name="Heading{$level}"> 
      <Title><xsl:value-of select="r/t"/></Title> 
      <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/> 
     </xsl:element> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:apply-templates select="current-group()"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each-group> 
</xsl:function> 

<xsl:template match="document"> 
    <Document> 
    <xsl:sequence select="mf:group(body/p, 1)"/> 
    </Document> 
</xsl:template> 

<xsl:template match="p"> 
    <Paragraph> 
    <xsl:value-of select="r/t"/> 
    </Paragraph> 
</xsl:template> 

</xsl:stylesheet> 

在您的示例輸入文檔中使用Saxon 9.4時我得到以下結果:

<?xml version="1.0" encoding="UTF-8"?> 
<Document> 
    <Paragraph>Text1-</Paragraph> 
    <Heading1> 
     <Title>Text2-</Title> 
     <Paragraph>Text3-</Paragraph> 
     <Paragraph>Text4-</Paragraph> 
     <Heading2> 
     <Title>Text5-</Title> 
     <Paragraph>Text6-</Paragraph> 
     <Heading3> 
      <Title>Text7-</Title> 
      <Paragraph>Text8-</Paragraph> 
     </Heading3> 
     </Heading2> 
    </Heading1> 
    <Heading1> 
     <Title>Text9-</Title> 
     <Paragraph>Text10-</Paragraph> 
    </Heading1> 
</Document> 
+0

我已經把你的XSLT文件在我的VS-2010項目folder.When我打開在VS-2010,然後它說:「\t‘XPath的默認命名空間’尚未實現」並且'xsl:function'還沒有實現。我使用VS-2010運行這個xslt文件,或者我需要包含任何東西 – Saravanan

+0

您將您的文章標記爲XSLT 2.0,所以我編寫了一個XSLT 2.0樣式表。要運行XSLT 2.0,您需要一個XSLT 2.0處理器,如Saxon 9或XmlPrime或AltovaXML。 –

+0

@Matrin Honnen:非常抱歉...我想在VS2010中運行此文件。如何將此代碼轉換爲按我的要求運行 – Saravanan