2013-04-20 72 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