使用XSLT将属性转换为元素时,如何仅忽略父元素

时间:2016-07-29 02:26:28

标签: xml xslt dom

我正在使用XSLT将某些包含所有值的xml转换为另一个xml,并将值保存为子元素。在我的xml中有两个子名,一个是aa,另一个是bbb。当我检查aa和bbb的值时,转换工作正常。问题是我想删除/忽略在这些子元素的父元素中找到的属性。

我在下面展示了迄今为止我尝试过的两个重要试验。第一个是我最初的想法,但我希望它避免使用父属性(确切地说" cod"和#34;包"在我的xml中)。

第二个是搜索周围的结果,但实际上是在远离我想要的东西。尽管如此,第二个尝试可以帮助我表达我可能缺少某些"模式"或某些"命令"从根元素跳过属性。

MyApp.java

Path f = Paths.get("C:\\in1.xsl");
//Path f = Paths.get("C:\\in2.xsl");
InputStream resourceAsStream = Files.newInputStream(f);
StreamSource xsl = new StreamSource(resourceAsStream);
Transformer transformer;
transformer = TransformerFactory.newInstance().newTransformer(xsl);
StreamSource in = new StreamSource(
              new FileInputStream("C:\\my_xml.xml"));
StreamResult out = new StreamResult(System.out);
transformer.transform(in, out); //in1 produced out1 and in2 produced out2

my_xml.xml

<c:product xmlns:c="myapp">
       <c:item cod="789">
              <c:aa name="024" value="123"/>
              <c:bbb name="0105" value="123456"/>
              <c:bbb name="0122" value="T"/>
              <c:aa name="071" value="00000001"/>
       </c:item>
       <c:item package="123" cod="11111">
              <c:aa name="002" value="753"/>
              <c:aa name="003" value="456"/>
              <c:bbb name="0146" value="147852"/>
       </c:item>
</c:product>

in1.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="UTF-8" indent="yes" standalone="no" omit-xml-declaration="yes"/>
       <xsl:template match="@*">
              <xsl:element name="{name(.)}">
                     <xsl:value-of select="."/>
              </xsl:element>
       </xsl:template>
       <xsl:template match="*">
              <xsl:copy>
                     <xsl:apply-templates select="@*|node()"/>
              </xsl:copy>
       </xsl:template>
</xsl:stylesheet>

in2.xls(来源Copy XML file contents except for root node and attribute XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


  <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="/*">
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>

out1.xml(我不想在第一项中使用cod元素我也不想在第二项中包装和鳕鱼)

<c:product xmlns:c="myapp">
<c:item>
<cod>789</cod>
<c:aa>
<name>024</name>
<value>123</value>
</c:aa>
<c:bbb>

<name>0105</name>

<value>123456</value>

</c:bbb>

<c:bbb>

<name>0122</name>

<value>T</value>

</c:bbb>

<c:aa>

<name>071</name>

<value>00000001</value>

</c:aa>

</c:item>

<c:item>

<package>123</package>

<cod>11111</cod>

<c:aa>

<name>002</name>

<value>753</value>

</c:aa>

<c:aa>

<name>003</name>

<value>456</value>

</c:aa>

<c:bbb>

<name>0146</name>

<value>147852</value>

</c:bbb>

</c:item>

</c:product>

out2.xml(好吧,这里有一点我试图利用来表达我的自我:根元素接受不同的处理。如果我发现如何通过忽略它们的属性来处理根元素并混合使用其余的in.xls我可能会发现我的解决方案)

      <aa name="024" value="123"/>

      <bbb name="0105" value="123456"/>

      <bbb name="0122" value="T"/>

      <aa name="071" value="00000001"/>

      <aa name="002" value="753"/>

      <aa name="003" value="456"/>

      <bbb name="0146" value="147852"/>

1 个答案:

答案 0 :(得分:0)

我猜(!)你想做的事情如下:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:c="myapp"
exclude-result-prefixes="c">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="c:item">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:element name="{local-name()}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

应用于输入示例时,结果将为:

<product>
   <item>
      <aa>
         <name>024</name>
         <value>123</value>
      </aa>
      <bbb>
         <name>0105</name>
         <value>123456</value>
      </bbb>
      <bbb>
         <name>0122</name>
         <value>T</value>
      </bbb>
      <aa>
         <name>071</name>
         <value>00000001</value>
      </aa>
   </item>
   <item>
      <aa>
         <name>002</name>
         <value>753</value>
      </aa>
      <aa>
         <name>003</name>
         <value>456</value>
      </aa>
      <bbb>
         <name>0146</name>
         <value>147852</value>
      </bbb>
   </item>
</product>

请注意,获得特殊处理的c:item元素(第二个模板)不是根元素。