2009-03-17 16 views
17

を使用して属性。しかし、グリッドは、XMLを次のフォーマットにする必要があります。は、我々は次の形式であるXMLファイルを出力し、現在のシステムを持っているXSLT

<INVENTORY> 
    <ITEM serialNumber="something" location="something" barcode="something"> 
    </ITEM> 
</INVENTORY> 

つまりアイテムノードの属性に変換する必要があります。

誰かがXSLTを使ってこれを行う方法を知っていますか?

<xsl:for-each select="//ITEM"> 
    <xsl:element name="ITEM"> 
     <xsl:attribute name="serialNumber"> 
     <xsl:value-of select="SERIALNUMBER"/> 
     </xsl:attribute> 
     <xsl:attribute name="location"> 
     <xsl:value-of select="LOCATION"/> 
     </xsl:attribute> 
     <xsl:attribute name="barcode"> 
     <xsl:value-of select="BARCODE"/> 
     </xsl:attribute> 
    </xsl:element> 
    </xsl:for-each> 

するか、Davidのショートカットを使用して::

+0

マークアップのドキュメントを読むと、SOがコードを認識できるように4つのスペースまたはタブが必要です。 – AnthonyWJones

+0

あなたが受け入れた答えは、あなたが望む結果を生むことはありません! 1つの属性名は "serialNumber"でなければならず、受け入れられる解決法は "serialnumber"を生成する。次回は、自分の時間を過ごす人々を助けようとしないでください。 –

答えて

27

を:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="INVENTORY"> 
    <INVENTORY> 
     <xsl:apply-templates/> 
    </INVENTORY> 
    </xsl:template> 

    <xsl:template match="ITEM"> 
    <ITEM> 
     <xsl:for-each select="*"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="text()"/> 
     </xsl:attribute> 

     </xsl:for-each> 
    </ITEM> 
    </xsl:template> 
</xsl:stylesheet> 

HTH

+0

あなたのすべての提案をありがとうが、これは最も単純で最もダイナミックな解決策:)と思われ、私のために働いた:) – eMTeeN

2

これはそれを行うべき

<xsl:for-each select="//ITEM"> 
    <ITEM serialNumber="{SERIALNUMBER}" location="{LOCATION}" barcode="{BARCODE}"/> 
</xsl:for-each> 
2

あなたのソースは、次のようになります場合:

<row><a>1</a><b>2</b></row> 

とあなたはそれが見えるようにしたいですこれは:

<row a="1" b="2" /> 

、このXSLTは動作するはずです:

<xsl:template match="row"> 
    <row a="{a}" b="{b}" /> 
</xsl:template> 
4

これらの2つのテンプレートは、それを行う必要があります: - 動作するはず

<xsl:template match="ITEM"> 
    <ITEM serialNumber="{SERIALNUMBER}" location="{LOCATION}" barcode="{BARCODE}" /> 
</xsl:template> 

<xsl:template match="INVENTORY"> 
    <INVENTORY> 
     <xsl:apply-templates /> 
    </INVENTORY> 
</xsl:template> 
4

ここにありますおそらく最も単純なsoluti上記の変換が提供に適用されるとき

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<!--            --> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="vrtfNameMapping"> 
    <item name="SERIALNUMBER" newName="serialNumber"/> 
    <item name="LOCATION" newName="location"/> 
    <item name="BARCODE" newName="barcode"/> 
    </xsl:variable> 
<!--            --> 
    <xsl:variable name="vNameMapping" select= 
    "document('')/*/xsl:variable[@name='vrtfNameMapping']"/> 
<!--            --> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 
<!--            --> 
    <xsl:template match="ITEM/*"> 
    <xsl:attribute name= 
    "{$vNameMapping/*[@name=name(current())]/@newName}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

:任意の属性名に要素名を変換しながら、その属性にITEMのすべての子要素を変換し、あるとして他のすべてを再現するにXMLドキュメント:指名手配結果はを生産している

<INVENTORY> 
    <ITEM> 
     <SERIALNUMBER>something</SERIALNUMBER> 
     <LOCATION>something</LOCATION> 
     <BARCODE>something</BARCODE> 
    </ITEM> 
</INVENTORY> 

<INVENTORY> 
    <ITEM serialNumber="something" location="something" barcode="something"/> 
</INVENTORY> 

に注意してください:

  1. identity rule

  2. の使用任意のxxx:node-set()拡張機能なし<xsl:strip-space elements="*"/>

  3. 変数vrtfNameMappingの使用の使用。

  4. 単純な下部ケーシングだけでなく、名前とnewNameの間のマッピングを処理するという事実。

+0

この変換のように見えません。それは結果をもたらさない。ちょうどこの:<?xmlのバージョンは、=「1.0」エンコード=「UTF-8」> Mark

+0

@マークは、これはどちらかがバギーXSLTプロセッサを持っていることを意味し、あるいは、あなたは正確にコピーして貼り付けていませんXML文書とその変換私は変換を再実行しました - 同じ結果がいくつかのXSLTプロセッサで生成されています –

関連する問題