让兄弟姐妹成为孩子

时间:2014-01-09 18:07:07

标签: xml xslt

这是我要翻译的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>`

这没有给出理想的结果。我正在努力争取这个要求。任何帮助都会有所帮助。

1 个答案:

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