我在转型期间遇到了一个问题,需要你的帮助。 我的XML:
<Root>
<ActualXML>
<Node>
<a>a1</a>
<b>b1</b>
<ChildNode1>
<c>c1</c>
<d>d1</d>
<e>e1</e>
</ChildNode1>
<ChildNode2>
<m>m1</m>
<n>n1</n>
<o>o1</o>
</ChildNode2>
</Node>
<Node>
<a>a2</a>
<b>b2</b>
<ChildNode1>
<c>c2</c>
<d>d2</d>
</ChildNode1>
</Node>
</ActualXML>
<ReferenceXML>
<Node>
<a sample=" "/>
<b sample=" "/>
<p sample=" "/>
<q sample=" "/>
</Node>
<ChildNode1>
<c sample=" "/>
<d sample=" "/>
<e sample=" "/>
<f sample=" "/>
</ChildNode1>
<ChildNode2>
<l sample=" "/>
<m sample=" "/>
<n sample=" "/>
<o sample=" "/>
</ChildNode2>
</ReferenceXML>
</Root>
从这个XML我必须执行两件事:
根据参考XML格式化实际XML。根据定义的标准参考向字符串长度添加空格。 - 这是实现
维护Actaul XML for Parent-Child-Parent的序列。
我当前的输出顺序是:Node-Node-ChildNode1-Childnode-1-Childnode2
我想要的输出序列是:Node-ChildNode1-Childnode2-Node-ChildNode1
当前的XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="replacements" select="Root/ActualXML"/>
<xsl:template match="/*">
<Root>
<xsl:apply-templates/>
</Root>
</xsl:template>
<xsl:template match="/Root/ActualXML">
<!--xsl:apply-templates select="@*|node()"/-->
</xsl:template>
<xsl:template match="ReferenceXML">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="ReferenceXML/*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//ReferenceXML/Node">
<xsl:call-template name="selectsNode">
<xsl:with-param name="i">1</xsl:with-param>
<xsl:with-param name="count" select="count(/Root/ActualXML/Node)"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="selectsNode">
<xsl:param name="i" />
<xsl:param name="count" />
<xsl:if test="$i <= $count">
<Node>
<xsl:apply-templates select="//ReferenceXML/Node/*" >
<xsl:with-param name="count" select="$i"/>
</xsl:apply-templates>
</Node>
</xsl:if>
<xsl:if test="$i <= $count">
<xsl:call-template name="selectsNode">
<xsl:with-param name="i">
<xsl:value-of select="$i + 1"/>
</xsl:with-param>
<xsl:with-param name="count">
<xsl:value-of select="$count"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="//ReferenceXML/Node/*">
<xsl:param name="count" />
<xsl:variable name="replacement"
select="$replacements/Node[position()=$count]/*[local-name() = local-name(current())]" />
<xsl:copy>
<xsl:value-of select="substring(concat($replacement | current()[not($replacement)],@sample),1,string-length(@sample))"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//ReferenceXML/ChildNode1">
<xsl:call-template name="selectsChildNode1">
<xsl:with-param name="i">1</xsl:with-param>
<xsl:with-param name="count" select="count(/Root/ActualXML/Node/ChildNode1)"></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="selectsChildNode1">
<xsl:param name="i" />
<xsl:param name="count" />
<xsl:if test="$i <= $count">
<ChildNode1>
<xsl:apply-templates select="//ReferenceXML/ChildNode1/*" >
<xsl:with-param name="count" select="$i"/>
</xsl:apply-templates>
</ChildNode1>
</xsl:if>
<xsl:if test="$i <= $count">
<xsl:call-template name="selectsChildNode1">
<xsl:with-param name="i">
<xsl:value-of select="$i + 1"/>
</xsl:with-param>
<xsl:with-param name="count">
<xsl:value-of select="$count"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template> <xsl:template match="//ReferenceXML/ChildNode1/*">
<xsl:param name="count" />
<xsl:variable name="replacement"
select="$replacements/Node[position()=$count]/ChildNode1/*[local-name() = local-name(current())]" />
<xsl:copy>
<xsl:value-of select="substring(concat($replacement | current()[not($replacement)],@sample),1,string-length(@sample))"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//ReferenceXML/ChildNode2/*">
<xsl:variable name="replacement"
select="$replacements/Node/ChildNode2/*[local-name() = local-name(current())]" />
<xsl:copy>
<xsl:value-of select="substring(concat($replacement | current()[not($replacement)],@sample),1,string-length(@sample))"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当前o / p xml:
<Root>
<ActualXML>
<Node>
<a>a1 </a>
<b>b1 </b>
<p> </p>
<q> </q>
</Node>
<Node>
<a>a2 </a>
<b>b2 </b>
<p> </p>
<q> </q>
</Node>
<ChildNode1>
<c>c1 </c>
<d>d1 </d>
<e>1</e>
<f> </f>
</ChildNode1>
<ChildNode1>
<c>c2 </c>
<d>d2 </d>
<e> </e>
<f> </f>
</ChildNode1>
<ChildNode2>
<l> </l>
<m>m1 </m>
<n>n1 </n>
<o>o1 </o>
</ChildNode2>
</ActualXML>
</Root>
所需的o / p xml: 我只在管理序列时需要帮助。
<Root>
<ActualXML>
<Node>
<a>a1 </a>
<b>b1 </b>
<p> </p>
<q> </q>
</Node>
<ChildNode1>
<c>c1 </c>
<d>d1 </d>
<e>1</e>
<f> </f>
</ChildNode1>
<ChildNode2>
<l> </l>
<m>m1 </m>
<n>n1 </n>
<o>o1 </o>
</ChildNode2>
<Node>
<a>a2 </a>
<b>b2 </b>
<p> </p>
<q> </q>
</Node>
<ChildNode1>
<c>c2 </c>
<d>d2 </d>
<e> </e>
<f> </f>
</ChildNode1>
</ActualXML>
</Root>