将xml root拆分为两个分支 - 可以选择删除不需要的属性

时间:2013-04-24 11:12:18

标签: xml xslt transform transformation

问题与我之前的问题非常类似(如何将xml root拆分为两个分支 - 除了第一个分支中的特定子项和第二个分支中的特定子项外)。

如前所述,我有一个文件:

<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>
    <parameter name="additional parameters" mode="on">
        <parameter name="preferences" type="internal">
            Not applicable
        </parameter>
        <parameter name="issues" type="internal" category="normal">
            None
        </parameter>
        <parameter name="complaints" type="internal">
            None
        </parameter>
        <parameter name="approbation" type="external">
            X11
        </parameter>
    </parameter>
</config>

这次我想解开一个名为“issues”的任意子项并将其放入单独的分支中并保留每个节点的所有属性(例如宽度,高度或任何可能存在的其他子项,例如颜色) - 解决方案由ABach提供(谢谢)。现在不同的是,我想在将节点移动到单独的分支

之前删除属性类别
<configs>
    <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>
        <parameter name="additional parameters" mode="on">
            <parameter name="preferences" type="internal">
                Not applicable
            </parameter>
            <parameter name="complaints" type="internal">
                None
            </parameter>
            <parameter name="approbation" type="external">
                X11
            </parameter>
        </parameter>
    </config>
    <config width="100" height="200">
        <parameter name="issues" type="internal">
                None
        </parameter>
    </config>
<configs>

子项及其父项的选择是硬编码(参数/参数)并基于属性名称(问题)

1 个答案:

答案 0 :(得分: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:strip-space elements="*" />

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

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

  <xsl:template match="config[parameter/parameter/@name = 'issues']">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates 
           select="parameter/parameter[@name = 'issues']"
           mode="extract" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="parameter/parameter[@name = 'issues']" />

  <xsl:template match="*" mode="extract">
    <xsl:copy>
      <xsl:apply-templates select="@*[local-name() != 'category'] | node()" />
    </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>
    <parameter name="email-address" accepts="yes">
      john.sparrow@rex.co.uk
    </parameter>
    <parameter name="postal-code" country="UK">
      W1A 1HQ
    </parameter>
    <parameter name="additional parameters" mode="on">
      <parameter name="preferences" type="internal">
        Not applicable
      </parameter>
      <parameter name="complaints" type="internal">
        None
      </parameter>
      <parameter name="approbation" type="external">
        X11
      </parameter>
    </parameter>
  </config>
  <config width="100" height="200">
    <parameter name="issues" type="internal">
      None
    </parameter>
  </config>
</configs>