2016-07-29 3 views
0

属性として構成されたすべての値を含む特定のxmlを別のxmlに変換して値を子要素として保持するにはXSLTを使用します。私のXMLには2つの子供の名前があり、1つはaaで、もう1つはbbbです。 aaとbbbの両方の値をチェックすると、変換は完全に機能しています。問題は、これらの子要素の親要素にある属性を削除/無視したいということです。属性をXSLTで要素に変換する方法親要素の属性のみを無視する方法

私は今までに試した2つの重要な仮説の下に示しています。最初の1つは私の元々のアイデアですが、私はそれを親属性(正確に "cod"と "xml"のパッケージ)を避けたいです。

2回目は検索の結果ですが、実際は私が望むものから遠ざかります。それにもかかわらず、2番目の試行は、私がおそらくルート要素から属性をスキップするための特定の "パターン"またはいくつかの "comand"のいずれかが不足していることを表現するのを助けることができます。

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

out1.xml(私は最初の項目でタラの要素をしたくないどちらも、私は2番目の項目にパッケージ化し、タラたい)

<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"/> 

+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> 

ご入力の例に適用すると、結果は次のようになります。特別な処理(第二テンプレート)を取得c:item要素があることを

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

注意ではないルート要素。

+0

私はそれよりも、より正確な答えを想像することはできません。私は不明な点は分かりませんが、あなたの推測は正しいと答えています。私は決定的な答えとしてあなたの答えを選んでいます。 P.S.:私はちょっと不思議です:XLSTとXLSでXMLの代わりにjsonで答えを出すことは可能でしょうか?まったく同じ入力ファイルですが、まずxmlからxmlを使用してxmlを変換し、次にxmlをjavaからtradionalに変換しないでjsonで出力しますか?したがって、入力はxmlになり、出力はjsonの属性でなくてもjsonになります。item: –

+1

私はそれが可能でなければならないと考えています。私はあなたに新しい質問でこれを尋ねることをお勧めします。そしてあなたが得ることを期待している正確なJSON出力を表示してください。 –

関連する問題