这是我要翻译的xml。
<?xml version="1.0" encoding="UTF-8" ?>
<Loop xmlns="http://www.example.org">
<Loop-2000A>
<Element-628>81</Element-628>
<Element-734 nil="nil82"/>
<Element-735>83</Element-735>
<Element-736>84</Element-736>
</Loop-2000A>
<Loop-2000B>
<Element-1035>85</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>87</Element-1037>
</Loop-2000B>
<Loop-2000B>
<Element-1035>98</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>97</Element-1037>
</Loop-2000B>
<Loop-2000A>
<Element-628>89</Element-628>
<Element-734 nil="nil82"/>
<Element-735>99</Element-735>
<Element-736>109</Element-736>
</Loop-2000A>
<Loop-2000B>
<Element-1035>208</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>87</Element-1037>
</Loop-2000B>
<Loop-2000B>
<Element-1035>209</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>97</Element-1037>
</Loop-2000B>
</Loop>
要求是...... B元素的父元素。因此,转换后的XML应该看起来像这样......
<?xml version = '1.0' encoding = 'UTF-8'?>
<ns2:TargetLoop xmlns:ns2="http://www.target.org">
<Loop-2000A>
<Loop-2000B>
<Element-1035>85</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>87</Element-1037>
</Loop-2000B>
<Loop-2000B>
<Element-1035>98</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>97</Element-1037>
</Loop-2000B>
<Element-628>81</Element-628>
<Element-734 nil="nil82"/>
<Element-735>83</Element-735>
<Element-736>84</Element-736>
</Loop-2000A>
<Loop-2000A>
<Loop-2000B>
<Element-1035>208</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>87</Element-1037>
</Loop-2000B>
<Loop-2000B>
<Element-1035>209</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>97</Element-1037>
</Loop-2000B>
<Element-628>89</Element-628>
<Element-734 nil="nil82"/>
<Element-735>99</Element-735>
<Element-736>109</Element-736>
</Loop-2000A>
我试过跟随xsl逻辑但是,它没有给出想要的结果。有人可以帮忙吗?
`<xsl:template match="/">
<ns2:TargetLoop>
<xsl:for-each select="/ns1:Loop/ns1:Loop-2000A">
<ns2:RepeatedLoop>
<ns2:Loop-2000A>
<xsl:call-template name="setLoopB">
<xsl:with-param name="a"/>
</xsl:call-template>
</ns2:Loop-2000A>
</ns2:RepeatedLoop>
</xsl:for-each>
</ns2:TargetLoop>
</xsl:template>
<xsl:template name="setLoopB">
<xsl:param name="a"/>
<ns2:Loop-2000B>
</ns2:Loop-2000B>
</xsl:template></xsl:stylesheet>`
这没有给出理想的结果。我正在努力争取这个要求。任何帮助都会有所帮助。
答案 0 :(得分:0)
使用样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ex="http://www.example.org" exclude-result-prefixes="ex">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="k1" match="ex:Loop-2000B" use="generate-id(preceding-sibling::ex:Loop-2000A[1])"/>
<xsl:template match="/ex:Loop">
<ns2:TargetLoop xmlns:ns2="http://www.target.org">
<xsl:apply-templates select="ex:Loop-2000A"/>
</ns2:TargetLoop>
</xsl:template>
<xsl:template match="ex:Loop-2000A">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="key('k1', generate-id())"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="ex:*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Saxon 6.5将您的输入样本转换为
<ns2:TargetLoop xmlns:ns2="http://www.target.org">
<Loop-2000A>
<Loop-2000B>
<Element-1035>85</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>87</Element-1037>
</Loop-2000B>
<Loop-2000B>
<Element-1035>98</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>97</Element-1037>
</Loop-2000B>
<Element-628>81</Element-628>
<Element-734 nil="nil82"/>
<Element-735>83</Element-735>
<Element-736>84</Element-736>
</Loop-2000A>
<Loop-2000A>
<Loop-2000B>
<Element-1035>208</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>87</Element-1037>
</Loop-2000B>
<Loop-2000B>
<Element-1035>209</Element-1035>
<Element-1036 nil="nil86"/>
<Element-1037>97</Element-1037>
</Loop-2000B>
<Element-628>89</Element-628>
<Element-734 nil="nil82"/>
<Element-735>99</Element-735>
<Element-736>109</Element-736>
</Loop-2000A>
</ns2:TargetLoop>
如果您有其他元素,请尝试
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ex="http://www.example.org" exclude-result-prefixes="ex">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="k1" match="ex:Loop-2000B" use="generate-id(preceding-sibling::ex:Loop-2000A[1])"/>
<xsl:template match="/ex:Loop">
<ns2:TargetLoop xmlns:ns2="http://www.target.org">
<xsl:apply-templates select="*[not(self::ex:Loop-2000B)]"/>
</ns2:TargetLoop>
</xsl:template>
<xsl:template match="ex:Loop-2000A">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="key('k1', generate-id())"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="ex:*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>