0

这个问题和我之前的一样。这次我有一个文件:

<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">
            None
        </parameter>
        <parameter name="complaints" type="internal">
            None
        </parameter>
        <parameter name="approbation" type="external">
            X11
        </parameter>
    </parameter>
</config>

这次我想解开一个名为“问题”的任意孩子并将其放入单独的分支中,就像这样

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

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

4

1 回答 1

0

这是一种方法。

当这个 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="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:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
      <config width="{@width}" height="{@height}">
        <xsl:apply-templates select="*/parameter[@name = 'issues']"/>
      </config>
    </configs>
  </xsl:template>

  <xsl:template match="parameter[@name = 'additional parameters']">
    <xsl:copy>
      <xsl:apply-templates
        select="@*|node()[not(self::parameter[@name = 'issues'])]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

...针对提供的 XML 应用:

<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">
            None
        </parameter>
    <parameter name="complaints" type="internal">
            None
        </parameter>
    <parameter name="approbation" type="external">
            X11
        </parameter>
  </parameter>
</config>

...产生了想要的结果:

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

编辑:OP 建议新创建<config>的包含元素<parameter name="issues" type="internal">应该复制原始元素的所有属性。<config>

在这种情况下,应该简单地改变:

<config width="{@width}" height="{@height}">
  <xsl:apply-templates select="*/parameter[@name = 'issues']"/>
</config>

...到:

<config>
  <xsl:apply-templates select="@*|*/parameter[@name = 'issues']"/>
</config>

...这意味着整个新解决方案将是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="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:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
      <config>
        <xsl:apply-templates select="@*|*/parameter[@name = 'issues']"/>
      </config>
    </configs>
  </xsl:template>

  <xsl:template match="parameter[@name = 'additional parameters']">
    <xsl:copy>
      <xsl:apply-templates
        select="@*|node()[not(self::parameter[@name = 'issues'])]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
于 2013-04-23T14:17:47.257 回答