2012-04-20 7 views
2

私はXSLT変換を行っています。私はタグと呼ばれるsometagを持っているソースファイルを持っています。出現順序が指定されていない場合にXSLTの子タグを処理する

私のソースxmlをこのように考えてみましょう。

<ABC> 
    <Name>Some Name </Name> 
    <ID>Some ID</ID> 
    <Address>Some Address</Address> 
    <Place>Some Place</Place> 
    <ID>Some ID</ID> 
    <Name>Some Name </Name> 
    <Name>Some Name </Name>  

</ABC> 

ルール:

ABC is parent Tag which has 4 child tags. Name, ID, Address, Place. 
    These child tags can occur many times and in any ordrer. 
    Upon reading the tag , I want to change the name of the tag, and do some processing on the value present in the tag. 
    The input XML may have child tags in any order, and many times. 
    I want to write a common XSLT which will read the child tags in the order in which they occur, and display them as given under. 

私はこのような出力を表示します。

 <Frame:Name> 
        <text>Some Name</text> 
     </Frame:Name> 
    <Frame:ID> 
        <text>Some ID</text> 
     </Frame:ID> 
     <Frame:ADdrress> 
        <text>Some Address</text> 
     </Frame:Address> 
     <Frame:Place> 
        <text>Some Place</text> 
     </Frame:Place> 
    <Frame:ID> 
        <text>Some ID</text> 
     </Frame:ID> 
     <Frame:Name> 
        <text>Some Name</text> 
     </Frame:Name> 
     <Frame:Name> 
        <text>Some Name</text> 
     </Frame:Name> 

私は完全にそれを行う方法に打撃を受けます。

子要素の出現順序がソースXMLで変更される場合は、出力XMLにも反映される必要があります。

レビューを共有できますか?

ありがとうございます。

+1

XSLTコードを共有できますか?それが良いように見える場合は、お客様の要件に応じて変更することができます。新しいコードを設計することはできますが、コードを投稿すると間違いを知ることができます –

+1

希望の結果で最後の 'Name'要素の1つが欠落しています。正してください。 –

+0

修正済み...ありがとうございました – Patan

答えて

1

、このような問題を解決するためのXSLTの方法は、テンプレートを使用することです。その結果は、通常はせずに、ずっと、シンプルな短いと理解しやすいコードで任意のxsl:choosexsl:whenxsl:otherwisexsl:ifxsl:for-each

<ABC> 
    <Name>Some Name </Name> 
    <ID>Some ID</ID> 
    <Address>Some Address</Address> 
    <Place>Some Place</Place> 
    <ID>Some ID</ID> 
    <Name>Some Name </Name> 
    <Name>Some Name </Name> 
</ABC> 
:この変換が提供されるXML文書
に適用され

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

<xsl:template match="/*"> 
    <t><xsl:apply-templates/></t> 
</xsl:template> 

<xsl:template match="*/*"> 
    <xsl:element name="Frame:{name()}" namespace="some:undefined namespace"> 
     <text><xsl:apply-templates /></text> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

希望の正しい結果が得られます

<t xmlns:Frame="some:undefined namespace"> 
    <Frame:Name> 
     <text>Some Name </text> 
    </Frame:Name> 
    <Frame:ID> 
     <text>Some ID</text> 
    </Frame:ID> 
    <Frame:Address> 
     <text>Some Address</text> 
    </Frame:Address> 
    <Frame:Place> 
     <text>Some Place</text> 
    </Frame:Place> 
    <Frame:ID> 
     <text>Some ID</text> 
    </Frame:ID> 
    <Frame:Name> 
     <text>Some Name </text> 
    </Frame:Name> 
    <Frame:Name> 
     <text>Some Name </text> 
    </Frame:Name> 
</t> 
+0

ありがとうございました。各要素のデータに対して何らかの操作を行うことはできますか?ため、タグの名前が直接変更されます。どうか明らかにしてください。 – Patan

+0

@muzimil:はい、マッチするテンプレートに追加の処理を実行できます。あなたの新しい問題について新しい質問をしてください。現在の問題には、この回答で提供されている完全な解決策があります。 –

+0

各タグにテキストをキャプチャし、他のテンプレートを呼び出したいとします。可能であれば、私はそれに質問を掲示すると言ってください。 – Patan

0

jeevanからの提案に基づいています。

<xsl:template match="ABC" > 
    <ABC> 
     <xsl:for-each select ="child::*"> 
     <xsl:choose> 
      <xsl:when test="name()='Name'"> 
      <xsl:element name="Frame:Name"> 
       <xsl:apply-templates select="."/> 
      </xsl:element> 
      </xsl:when> 

      <xsl:when test="name()='ID'"> 
      <Frame:ID> 
       <xsl:apply-templates select="."/> 
      </Frame:ID> 
      </xsl:when> 
      <xsl:when test="name()='Address'"> 
      <Frame:Address> 
       <xsl:apply-templates select="."/> 
      </Frame:Address> 
      </xsl:when> 

      <xsl:when test="name()='Place'"> 
      <Frame:Place> 
       <xsl:apply-templates select="."/> 
      </Frame:Place> 
      </xsl:when> 
    </xsl:choose> 
     </xsl:for-each> 

+0

3倍短い解決策をご覧になりたい場合があります:) –

+0

恐ろしいコードです。 xslを使用しないでください:要素名をオンにすることを選択してください。これがテンプレートルールの目的です。 –

関連する問題