【问题标题】:xml group elements by nodename which changes by suffixxml 按节点名分组元素,节点名按后缀更改
【发布时间】:2013-04-13 22:36:51
【问题描述】:

我正在尝试将 XML 转换为特定的输出 XML。但我无法按 N 更改一组字段的位置进行分组。

    <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 个。 谢谢。

【问题讨论】:

    标签: xml transform nodes


    【解决方案1】:

    以下 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>
    

    【讨论】:

    • 感谢您提供 XSL。我尝试使用 XslCompiledTransform 将它与我的 Visual Studio 2010 解决方案一起使用。加载 XSL 时失败,提到 for-each-group 尚未实现。尝试 google,但找不到解决该问题的答案。
    • 我确实指出这是一个 XSLT 2.0 解决方案。 Saxonica 和 XmlPrime 提供了用于 .NET 的 XSLT 2.0 处理器。 Microsoft 的 XML 技术已经过时了,是时候摆脱它们了。
    • 我没有选择。那么,是否可以用任何 1.0 版本代码 sn-p 替换 for-each-group?我试着写一些 xslt 谷歌搜索和理解点点滴滴。在 xslt 之后:
    • 是的,它可以用 XSLT 1.0 完成,但要困难得多,我没有任何动力来帮助你。
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多