2013-04-20 117 views
1

我想將XML轉換爲特定的輸出XML。但是我不能根據N的變化對一組領域進行分組。通過節點名稱xml組元素由後綴更改

<Balances> 
     <Balances_Line_Item0> 
      <Page> 
      <Field>EmpID</Field> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      </Page> 
     </Balances_Line_Item0> 
     <Balances_Line_Item0> 
      <Page> 
      <Field>Name</Field> 
      <Letter>53</Letter> 
      <Letter>56</Letter> 
      <Letter>76</Letter> 
      <Letter>53</Letter> 
      <Letter>56</Letter> 
      <Letter>76</Letter> 
     </Page> 
     </Balances_Line_Item0> 
     <Balances_Line_Item0> 
      <Page> 
      <Field>Department</Field> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      </Page> 
     </Balances_Line_Item0> 
     <Balances_Line_Item1> 
      <Page> 
      <Field>EmpID</Field> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      </Page> 
     </Balances_Line_Item1> 
     <Balances_Line_Item1> 
      <Page> 
      <Field>Name</Field> 
      <Letter>53</Letter> 
      <Letter>56</Letter> 
      <Letter>76</Letter> 
      <Letter>53</Letter> 
      <Letter>56</Letter> 
      <Letter>76</Letter> 
     </Page> 
     </Balances_Line_Item1> 
     <Balances_Line_Item1> 
      <Page> 
      <Field>Department</Field> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      </Page> 
     </Balances_Line_Item1> 
     <Balances_Line_Item2> 
      <Page> 
      <Field>EmpID</Field> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      </Page> 
     </Balances_Line_Item2> 
     <Balances_Line_Item2> 
      <Page> 
      <Field>Name</Field> 
      <Letter>53</Letter> 
      <Letter>56</Letter> 
      <Letter>76</Letter> 
      <Letter>53</Letter> 
      <Letter>56</Letter> 
      <Letter>76</Letter> 
     </Page> 
     </Balances_Line_Item2> 
     <Balances_Line_Item2> 
      <Page> 
      <Field>Department</Field> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      <Letter>45</Letter> 
      </Page> 
     </Balances_Line_Item2> 
    </Balances> 

我轉換XML應該是:

<Balances> 
<Balances_Line_Item0> 
<EmpID> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
</EmpID> 
<Name> 
     <Letter>53</Letter> 
     <Letter>56</Letter> 
     <Letter>76</Letter> 
     <Letter>53</Letter> 
     <Letter>56</Letter> 
     <Letter>76</Letter> 
</Name> 
<Dept> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
</Dept> 
</Balances_Line_Item0> 
<Balances_Line_Item1> 
<EmpID> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
</EmpID> 
<Name> 
     <Letter>53</Letter> 
     <Letter>56</Letter> 
     <Letter>76</Letter> 
     <Letter>53</Letter> 
     <Letter>56</Letter> 
     <Letter>76</Letter> 
</Name> 
<Dept> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
</Dept> 
</Balances_Line_Item1> 
<Balances_Line_Item2> 
<EmpID> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
</EmpID> 
<Name> 
     <Letter>53</Letter> 
     <Letter>56</Letter> 
     <Letter>76</Letter> 
     <Letter>53</Letter> 
     <Letter>56</Letter> 
     <Letter>76</Letter> 
</Name> 
<Dept> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
     <Letter>45</Letter> 
</Dept> 
</Balances_Line_Item2> 
</Balances> 

如何輸入XML轉化爲上面的XML?請建議。


我申請上生成的XML多了一個轉變:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
    <xsl:copy> 
     <xsl:element name="Balances"> 
     <xsl:for-each select="Balances/node()[position() mod 5 = 1]"> 
      <xsl:element name="LineItem"> 
      <xsl:for-each select=". | following-sibling::node()[not(position() > 4)]"> 
       <xsl:copy-of select="."/> 
      </xsl:for-each> 
      </xsl:element> 
     </xsl:for-each> 
     </xsl:element> 
      </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

但我的XSLT是非常基本的,我不能繼續使用該XSL用於更復雜的轉換。有人建議調整和更好的xslt,可能是一個XSLT,而不是2. 謝謝。

回答

0

以下XSLT 2.0樣式表做這項工作:

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

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

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

    <xsl:template match="*"> 
    <xsl:copy><xsl:apply-templates/></xsl:copy> 
    </xsl:template> 

    <xsl:template match="Balances"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-adjacent="name()"> 
     <xsl:copy> 
      <xsl:apply-templates select="current-group()/*"/> 
     </xsl:copy> 
     </xsl:for-each-group> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Page"> 
    <xsl:apply-templates select="Field"/> 
    </xsl:template> 

    <xsl:template match="Field"> 
    <xsl:element name="{.}"> 
     <xsl:apply-templates select="following-sibling::*"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝你的XSL。我試着用我的Visual Studio 2010解決方案使用XslCompiledTransform。它沒有加載XSL,提到for-each-group尚未實現。嘗試google,但找不到解決該問題的答案。 – user2302627 2013-04-21 04:59:06

+0

我確實指出這是一個XSLT 2.0解決方案。用於.NET的XSLT 2.0處理器可以從Saxonica和XmlPrime獲得。微軟的XML技術已經過時了,現在是時候讓自己擺脫困境了。 – 2013-04-22 08:01:59

+0

我沒有選擇。那麼,是否有可能用任何1.0版本的代碼片段替換每個組?我試圖寫一些xslt搜索和理解點點滴滴。遵循xslt: – user2302627 2013-04-22 16:00:53