0

如果我有这个文件

<config someAttribute="sA" otherAttribute="oA">
<parameter name="p1" yetAnotherAttribute="yAA">
    Something
</parameter>
<parameter name="p2" yetAnotherAttribute="yAA2">
    Something else
</parameter>
<parameter name="p3" yetAnotherAttribute="yAA3">
    Something more
</parameter>
<parameter name="p4" yetAnotherAttribute="yAA4">
    Yet more 
</parameter>
</config>

我想要这样的东西

<configs>
<config someAttribute="sA" otherAttribute="oA">
    <parameter name="p1" yetAnotherAttribute="yAA">
        Something
    </parameter>
    <parameter name="p2" yetAnotherAttribute="yAA2">
        Something else
    </parameter>
</config>
<config someAttribute="sA" otherAttribute="oA">
    <parameter name="p3" yetAnotherAttribute="yAA3">
        Something more
    </parameter>
    <parameter name="p4" yetAnotherAttribute="yAA4">
        Yet more 
    </parameter>
</config>
</configs>

你能帮我处理xslt文件吗?您能否也告诉我在哪里可以找到一些有用的学习 xslt 的资源(从基础到高级主题,除了 w3schools)?

我决定提供更有意义的文件

我想转换这个文件

<config width="100" height="200">
<parameter name="account number" country="UK">
    12345678901234567890123456
</parameter>
<parameter name="client code" codeType="xa">
    UK0112
</parameter>
<parameter name="email-address" accepts="yes">
    john.sparrow@rex.co.uk
</parameter>
<parameter name="postal-code" country="UK">
    W1A 1HQ 
</parameter>
</config>

进入这个文件

<configs>
<config width="100" height="200">
    <parameter name="account number" country="UK">
        12345678901234567890123456
    </parameter>
    <parameter name="client code" codeType="xa">
        UK0112
    </parameter>
</config>
<config width="100" height="200">
    <parameter name="email-address" accepts="yes">
        john.sparrow@rex.co.uk
    </parameter>
    <parameter name="postal-code" country="UK">
        W1A 1HQ 
    </parameter>    
</config>
</configs>

亲切的问候,我的

4

1 回答 1

0

由于除了“帐号”和“客户编号”放在第一组,“电子邮件地址”和“邮政编码”放在第二组之外,这里似乎没有任何统一的规则,我能做到的最好推荐这种硬编码的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

  <xsl:template match="/*">
    <configs>
      <xsl:call-template name="Group">
        <xsl:with-param name="children"
                        select="*[@name = 'account number' or
                                  @name = 'client code']" />
      </xsl:call-template>
      <xsl:call-template name="Group">
        <xsl:with-param name="children"
                        select="*[@name = 'email-address' or
                                  @name = 'postal-code']" />
      </xsl:call-template>
    </configs>
  </xsl:template>

  <xsl:template name="Group">
    <xsl:param name="children" />

    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates select="$children" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,结果是:

<configs>
  <config width="100" height="200">
    <parameter name="account number" country="UK">
      12345678901234567890123456
    </parameter>
    <parameter name="client code" codeType="xa">
      UK0112
    </parameter>
  </config>
  <config width="100" height="200">
    <parameter name="email-address" accepts="yes">
      john.sparrow@rex.co.uk
    </parameter>
    <parameter name="postal-code" country="UK">
      W1A 1HQ
    </parameter>
  </config>
</configs>

或者,如果您想根据它们在源数据中的顺序将项目分成 2 个(或任意数量)的组,您可以这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:variable name="groupSize" select="2" />

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

  <xsl:template match="/*">
    <configs>
      <xsl:apply-templates select="parameter[position() mod $groupSize = 1]"
                           mode="group" />
    </configs>
  </xsl:template>

  <xsl:template match="*" mode="group">
    <config>
      <xsl:apply-templates select ="../@*" />
      <xsl:apply-templates 
        select=". | following-sibling::*[position() &lt; $groupSize]"/>
    </config>
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,这会产生与上述相同的结果。

于 2013-04-23T12:31:51.570 回答