如何将每个父元素复制到子元素中?
How to copy each parent into child elements?
我有以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<LaborTaskInterface>
<LaborTask thing100="a" thing2="c" thing3="d" thing4="e" thing500="f"
thing6="g" thing7="h" thing8="i" thing9="j">
<ltOverride unit_id="1" value="1" thing2="k" thing3="c" thing4="d" thing10="o" thing500="z"/>
<ltOverride unit_id="2" value="1" thing2="l" thing3="c" thing4="d" thing11="p" thing500="z"/>
<ltOverride unit_id="3" value="1" thing2="m" thing3="c" thing4="d" thing12="q" thing500="z"/>
<ltOverride unit_id="4" value="1" thing2="n" thing3="c" thing4="d" thing13="r" thing500="z"/>
</LaborTask>
<LaborTask thing1="aa" thing2="bb" thing3="dd" thing4="ee" thing5="ff"
thing6="gg" thing7="hh" thing8="ii" thing9="jj" thing14="xx">
<ltOverride unit_id="11" value="11" thing2="kk" thing3="cc" thing4="dd" thing10="oo" thing14="yy"/>
<ltOverride unit_id="22" value="12" thing2="ll" thing3="cc" thing4="dd" thing11="pp" thing14="yy"/>
<ltOverride unit_id="33" value="13" thing2="mm" thing3="cc" thing4="dd" thing12="qq" thing14="yy"/>
<ltOverride unit_id="44" value="14" thing2="nn" thing3="cc" thing4="dd" thing13="rr" thing14="yy"/>
</LaborTask>
</LaborTaskInterface>
我正在尝试将 LaborTask 的每个实例 persist/copy 放入每个后续 ItOverride 并删除 LaborTask 节点,以便只有一个 table (ItOverride)。
我正在使用以下 XSLT-1.0(因为 Microsoft Access 要求 XSLT-1.0):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
extension-element-prefixes="msxsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="attr-by-name" match="ltOverride/@*" use="name()"/>
<xsl:key name="value" match="ltOverride/@*" use="concat(name(), generate-id(..))"/>
<xsl:template match="/LaborTaskInterface">
<xsl:variable name="xml" select="/" />
<!-- base -->
<xsl:variable name="base-attr" select="LaborTask/@*"/>
<xsl:variable name="base-elems">
<xsl:for-each select="$base-attr">
<xsl:element name="{name()}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:variable>
<!-- override -->
<xsl:variable name="override-columns">
<xsl:for-each select="LaborTask/ltOverride/@*[generate-id() = generate-id(key('attr-by-name', name())[1])]">
<col name="{name()}"/>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<xsl:copy>
<xsl:for-each select="LaborTask/ltOverride">
<xsl:variable name="id" select="generate-id()" />
<xsl:copy>
<xsl:for-each select="$base-elems"/>
<xsl:copy-of select="$base-elems"/>
<xsl:for-each select="msxsl:node-set($override-columns)/col">
<xsl:variable name="name" select="@name" />
<xsl:variable name="dup">
<xsl:if test="$base-attr[name() = $name]">.2</xsl:if>
</xsl:variable>
<xsl:element name="{@name}{$dup}">
<!-- switch context back to input document in order to use key -->
<xsl:for-each select="$xml">
<xsl:value-of select="key('value', concat($name, $id))" />
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是我得到的不想要的输出(我试图循环 $base-elem):
<?xml version="1.0" encoding="utf-16"?>
<LaborTaskInterface>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>1</unit_id>
<value>1</value>
<thing2.2>k</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10>o</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>2</unit_id>
<value>1</value>
<thing2.2>l</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10></thing10>
<thing11>p</thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>3</unit_id>
<value>1</value>
<thing2.2>m</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12>q</thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>4</unit_id>
<value>1</value>
<thing2.2>n</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>r</thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>11</unit_id>
<value>11</value>
<thing2.2>kk</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10>oo</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>22</unit_id>
<value>12</value>
<thing2.2>ll</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10></thing10>
<thing11>pp</thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>33</unit_id>
<value>13</value>
<thing2.2>mm</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12>qq</thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>44</unit_id>
<value>14</value>
<thing2.2>nn</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>rr</thing13>
</ltOverride>
</LaborTaskInterface>
您可以在上面的输出中看到第一个 LaborTask 实例(其中 thing1="a")被引入到 8 个 ItOverride 中。
这是期望的输出(请注意第一个 LaborTask 实例如何被带入前 4 个 ItOverride,第二个 LaborTask 实例被带入接下来的 4 个 ItOverride 实例):
<LaborTaskInterface>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>k</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>1</unit_id>
<value>1</value>
<thing10>o</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>l</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>2</unit_id>
<value>1</value>
<thing10></thing10>
<thing11>p</thing11>
<thing12></thing12>
<thing13></thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>m</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>3</unit_id>
<value>1</value>
<thing10></thing10>
<thing11></thing11>
<thing12>q</thing12>
<thing13></thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>n</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>4</unit_id>
<value>1</value>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>r</thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>kk</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>11</unit_id>
<value>11</value>
<thing10>oo</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>ll</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>22</unit_id>
<value>12</value>
<thing10></thing10>
<thing11>pp</thing11>
<thing12></thing12>
<thing13></thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>mm</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>33</unit_id>
<value>13</value>
<thing10></thing10>
<thing11></thing11>
<thing12>qq</thing12>
<thing13></thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>nn</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>44</unit_id>
<value>14</value>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>rr</thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
</LaborTaskInterface>
感谢大家的帮助。
修改后的 XSLT
<xsl:variable name="attributeNames">
<xsl:for-each select="//LaborTask/@*|//ltOverride/@*">
<xsl:element name="name">
<xsl:value-of select="name()"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<!-- Use your own namespace instead of msxml. -->
<xsl:variable name="attributeNameList" select="msxml:node-set($attributeNames)"/>
<xsl:variable name="distintAttributeNames">
<xsl:copy-of select="$attributeNameList/name[not(. = preceding-sibling::name)]"/>
</xsl:variable>
<!-- Use your own namespace instead of msxml. -->
<xsl:variable name="distintChildAttributeNameList" select="msxml:node-set($distintAttributeNames)"/>
<xsl:template match="LaborTaskInterface">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="LaborTask">
<xsl:apply-templates select="node()">
<xsl:with-param name="LaborTaskAttributes" select="@*"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ltOverride">
<xsl:param name="LaborTaskAttributes"/>
<xsl:variable name="ltOverride" select="@*"/>
<xsl:variable name="emptyAttributes">
<xsl:element name="holder">
<xsl:for-each select="$distintChildAttributeNameList/name">
<xsl:variable name="name" select="."/>
<xsl:if test="not($LaborTaskAttributes[name() = $name] or $ltOverride[name() = $name])">
<xsl:attribute name="{$name}"/>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:variable>
<!-- Use your own namespace instead of msxml. -->
<xsl:variable name="emptyAttributesList" select="msxml:node-set($emptyAttributes)"/>
<xsl:copy>
<xsl:apply-templates select="$LaborTaskAttributes|@*|$emptyAttributesList/holder/@*">
<xsl:sort select="name()" data-type="text" order="ascending"/>
<xsl:with-param name="LaborTaskAttributes" select="$LaborTaskAttributes"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:param name="LaborTaskAttributes"/>
<xsl:variable name="id" select="generate-id(.)"/>
<xsl:variable name="nm" select="name()"/>
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="not($LaborTaskAttributes[name() = $nm])">
<xsl:value-of select="name()"/>
</xsl:when>
<xsl:when test="$LaborTaskAttributes[generate-id(.) = $id]">
<xsl:value-of select="name()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(name(), '.2')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:param name="LaborTaskAttributes"/>
<xsl:apply-templates select="node()">
<xsl:with-param name="LaborTaskAttributes" select="$LaborTaskAttributes"/>
</xsl:apply-templates>
</xsl:template>
我有以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<LaborTaskInterface>
<LaborTask thing100="a" thing2="c" thing3="d" thing4="e" thing500="f"
thing6="g" thing7="h" thing8="i" thing9="j">
<ltOverride unit_id="1" value="1" thing2="k" thing3="c" thing4="d" thing10="o" thing500="z"/>
<ltOverride unit_id="2" value="1" thing2="l" thing3="c" thing4="d" thing11="p" thing500="z"/>
<ltOverride unit_id="3" value="1" thing2="m" thing3="c" thing4="d" thing12="q" thing500="z"/>
<ltOverride unit_id="4" value="1" thing2="n" thing3="c" thing4="d" thing13="r" thing500="z"/>
</LaborTask>
<LaborTask thing1="aa" thing2="bb" thing3="dd" thing4="ee" thing5="ff"
thing6="gg" thing7="hh" thing8="ii" thing9="jj" thing14="xx">
<ltOverride unit_id="11" value="11" thing2="kk" thing3="cc" thing4="dd" thing10="oo" thing14="yy"/>
<ltOverride unit_id="22" value="12" thing2="ll" thing3="cc" thing4="dd" thing11="pp" thing14="yy"/>
<ltOverride unit_id="33" value="13" thing2="mm" thing3="cc" thing4="dd" thing12="qq" thing14="yy"/>
<ltOverride unit_id="44" value="14" thing2="nn" thing3="cc" thing4="dd" thing13="rr" thing14="yy"/>
</LaborTask>
</LaborTaskInterface>
我正在尝试将 LaborTask 的每个实例 persist/copy 放入每个后续 ItOverride 并删除 LaborTask 节点,以便只有一个 table (ItOverride)。
我正在使用以下 XSLT-1.0(因为 Microsoft Access 要求 XSLT-1.0):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
extension-element-prefixes="msxsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="attr-by-name" match="ltOverride/@*" use="name()"/>
<xsl:key name="value" match="ltOverride/@*" use="concat(name(), generate-id(..))"/>
<xsl:template match="/LaborTaskInterface">
<xsl:variable name="xml" select="/" />
<!-- base -->
<xsl:variable name="base-attr" select="LaborTask/@*"/>
<xsl:variable name="base-elems">
<xsl:for-each select="$base-attr">
<xsl:element name="{name()}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:variable>
<!-- override -->
<xsl:variable name="override-columns">
<xsl:for-each select="LaborTask/ltOverride/@*[generate-id() = generate-id(key('attr-by-name', name())[1])]">
<col name="{name()}"/>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<xsl:copy>
<xsl:for-each select="LaborTask/ltOverride">
<xsl:variable name="id" select="generate-id()" />
<xsl:copy>
<xsl:for-each select="$base-elems"/>
<xsl:copy-of select="$base-elems"/>
<xsl:for-each select="msxsl:node-set($override-columns)/col">
<xsl:variable name="name" select="@name" />
<xsl:variable name="dup">
<xsl:if test="$base-attr[name() = $name]">.2</xsl:if>
</xsl:variable>
<xsl:element name="{@name}{$dup}">
<!-- switch context back to input document in order to use key -->
<xsl:for-each select="$xml">
<xsl:value-of select="key('value', concat($name, $id))" />
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是我得到的不想要的输出(我试图循环 $base-elem):
<?xml version="1.0" encoding="utf-16"?>
<LaborTaskInterface>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>1</unit_id>
<value>1</value>
<thing2.2>k</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10>o</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>2</unit_id>
<value>1</value>
<thing2.2>l</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10></thing10>
<thing11>p</thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>3</unit_id>
<value>1</value>
<thing2.2>m</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12>q</thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>4</unit_id>
<value>1</value>
<thing2.2>n</thing2.2>
<thing3.2>c</thing3.2>
<thing4.2>d</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>r</thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>11</unit_id>
<value>11</value>
<thing2.2>kk</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10>oo</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>22</unit_id>
<value>12</value>
<thing2.2>ll</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10></thing10>
<thing11>pp</thing11>
<thing12></thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>33</unit_id>
<value>13</value>
<thing2.2>mm</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12>qq</thing12>
<thing13></thing13>
</ltOverride>
<ltOverride>
<thing1>a</thing1>
<thing2>c</thing2>
<thing3>d</thing3>
<thing4>e</thing4>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<thing1>aa</thing1>
<thing2>bb</thing2>
<thing3>dd</thing3>
<thing4>ee</thing4>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>44</unit_id>
<value>14</value>
<thing2.2>nn</thing2.2>
<thing3.2>cc</thing3.2>
<thing4.2>dd</thing4.2>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>rr</thing13>
</ltOverride>
</LaborTaskInterface>
您可以在上面的输出中看到第一个 LaborTask 实例(其中 thing1="a")被引入到 8 个 ItOverride 中。
这是期望的输出(请注意第一个 LaborTask 实例如何被带入前 4 个 ItOverride,第二个 LaborTask 实例被带入接下来的 4 个 ItOverride 实例):
<LaborTaskInterface>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>k</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>1</unit_id>
<value>1</value>
<thing10>o</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>l</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>2</unit_id>
<value>1</value>
<thing10></thing10>
<thing11>p</thing11>
<thing12></thing12>
<thing13></thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>m</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>3</unit_id>
<value>1</value>
<thing10></thing10>
<thing11></thing11>
<thing12>q</thing12>
<thing13></thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1></thing1>
<thing100>a</thing100>
<thing2>c</thing2>
<thing2.2>n</thing2.2>
<thing3>d</thing3>
<thing3.2>c</thing3.2>
<thing4>e</thing4>
<thing4.2>d</thing4.2>
<thing5>f</thing5>
<thing6>g</thing6>
<thing7>h</thing7>
<thing8>i</thing8>
<thing9>j</thing9>
<unit_id>4</unit_id>
<value>1</value>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>r</thing13>
<thing14></thing14>
<thing14.2></thing14.2>
<thing500>f</thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>kk</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>11</unit_id>
<value>11</value>
<thing10>oo</thing10>
<thing11></thing11>
<thing12></thing12>
<thing13></thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>ll</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>22</unit_id>
<value>12</value>
<thing10></thing10>
<thing11>pp</thing11>
<thing12></thing12>
<thing13></thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>mm</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>33</unit_id>
<value>13</value>
<thing10></thing10>
<thing11></thing11>
<thing12>qq</thing12>
<thing13></thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
<ltOverride>
<thing1>aa</thing1>
<thing100></thing100>
<thing2>bb</thing2>
<thing2.2>nn</thing2.2>
<thing3>dd</thing3>
<thing3.2>cc</thing3.2>
<thing4>ee</thing4>
<thing4.2>dd</thing4.2>
<thing5>ff</thing5>
<thing6>gg</thing6>
<thing7>hh</thing7>
<thing8>ii</thing8>
<thing9>jj</thing9>
<unit_id>44</unit_id>
<value>14</value>
<thing10></thing10>
<thing11></thing11>
<thing12></thing12>
<thing13>rr</thing13>
<thing14>xx</thing14>
<thing14.2>yy</thing14.2>
<thing500></thing500>
</ltOverride>
</LaborTaskInterface>
感谢大家的帮助。
修改后的 XSLT
<xsl:variable name="attributeNames">
<xsl:for-each select="//LaborTask/@*|//ltOverride/@*">
<xsl:element name="name">
<xsl:value-of select="name()"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<!-- Use your own namespace instead of msxml. -->
<xsl:variable name="attributeNameList" select="msxml:node-set($attributeNames)"/>
<xsl:variable name="distintAttributeNames">
<xsl:copy-of select="$attributeNameList/name[not(. = preceding-sibling::name)]"/>
</xsl:variable>
<!-- Use your own namespace instead of msxml. -->
<xsl:variable name="distintChildAttributeNameList" select="msxml:node-set($distintAttributeNames)"/>
<xsl:template match="LaborTaskInterface">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="LaborTask">
<xsl:apply-templates select="node()">
<xsl:with-param name="LaborTaskAttributes" select="@*"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ltOverride">
<xsl:param name="LaborTaskAttributes"/>
<xsl:variable name="ltOverride" select="@*"/>
<xsl:variable name="emptyAttributes">
<xsl:element name="holder">
<xsl:for-each select="$distintChildAttributeNameList/name">
<xsl:variable name="name" select="."/>
<xsl:if test="not($LaborTaskAttributes[name() = $name] or $ltOverride[name() = $name])">
<xsl:attribute name="{$name}"/>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:variable>
<!-- Use your own namespace instead of msxml. -->
<xsl:variable name="emptyAttributesList" select="msxml:node-set($emptyAttributes)"/>
<xsl:copy>
<xsl:apply-templates select="$LaborTaskAttributes|@*|$emptyAttributesList/holder/@*">
<xsl:sort select="name()" data-type="text" order="ascending"/>
<xsl:with-param name="LaborTaskAttributes" select="$LaborTaskAttributes"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:param name="LaborTaskAttributes"/>
<xsl:variable name="id" select="generate-id(.)"/>
<xsl:variable name="nm" select="name()"/>
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="not($LaborTaskAttributes[name() = $nm])">
<xsl:value-of select="name()"/>
</xsl:when>
<xsl:when test="$LaborTaskAttributes[generate-id(.) = $id]">
<xsl:value-of select="name()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(name(), '.2')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:param name="LaborTaskAttributes"/>
<xsl:apply-templates select="node()">
<xsl:with-param name="LaborTaskAttributes" select="$LaborTaskAttributes"/>
</xsl:apply-templates>
</xsl:template>