0

私は XSLT が初めてです。私のタスクの 1 つで、XML ファイルを特定の形式のテキスト ファイルに変換する必要があります。それを行うための簡単で迅速な方法があるのだろうかと思っています。

私のXMLは以下のようになります

<?xml version="1.0" encoding="UTF-8"?>
<QTKTRes xmlns="http://www.xxx.com/app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2013-03-19T15:40:58-05:00" transLanguage="EN" baseLanguage="EN" messageID="1363722058486545315" appVersion="5 1 20110725-1550" rsStart="0" rsCount="1" rsTotal="1">
<TKTSet>
<TKT>
  <COST>0.0</COST>
  <HRS>0.0</HRS>
  <CHANGEDATE>2013-02-19T14:59:51-05:00</CHANGEDATE>
  <TKTID>101</TKTID>
  <TKTSPEC>
    <ATTRID>PMSCR</ATTRID>
    <REID>101</REID>
    <VALUEN>RDPS</VALUE>
  </TKTSPEC>
  <TKTSPEC>
    <ATTRID>PMSCQ</ATTRID>
    <REID>101</REID>
    <VALUET>RDPQ</VALUE>
  </TKTSPEC>
<TKT>
<TKTSet>
</QTKTRes>

`

私の望ましい出力は以下のように必要です:-

COST=0.0&
HRS=0.0&
CHANGEDATE=2013-02-19T14:59:51-05:00&
TKTID=101&
TKTSPEC.1.ATTRID=PMSCR&
TKTSPEC.1.REID=101&
TKTSPEC.1.VALUEN=RDPS&
TKTSPEC.2.ATTRID=PMSCR&
TKTSPEC.2.REID=101&
TKTSPEC.2.VALUET=RDPQ

利用できるツールはありますか、それとも手動で XSLT スタイルシートを作成する必要がありますか。私はこの分野に不慣れです。貴重なご回答をお待ちしております。

4

1 に答える 1

1

TKTの子要素を、ノード名の後に=、その値、および&最後の行を除くすべての行でリストしたいだけの場合、これは機能するはずです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:app="http://www.xxx.com/app">
  <xsl:output method="text" />
  <xsl:strip-space elements="*" />

  <xsl:template match="app:TKT//*">
    <xsl:param name="prefix" />
    <xsl:param name="inLast" select="true()" />

    <xsl:value-of select="concat($prefix, local-name(), '=', normalize-space())"/>
    <xsl:if test="not($inLast) or position() != last()">
      <xsl:text>&amp;&#xA;</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template match="app:TKT//*[*]">
    <xsl:param name="inLast" select="true()" />
    <xsl:variable name="num">
      <xsl:number />
    </xsl:variable>

    <xsl:apply-templates>
      <xsl:with-param name="prefix" 
                      select="concat(local-name(), '.', $num, '.')" />
      <xsl:with-param name="inLast" 
                      select="$inLast and position() = last()" />
    </xsl:apply-templates>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

COST=0.0&
HRS=0.0&
CHANGEDATE=2013-02-19T14:59:51-05:00&
TKTID=101&
TKTSPEC.1.ATTRID=PMSCR&
TKTSPEC.1.REID=101&
TKTSPEC.1.VALUE=RDPS&
TKTSPEC.2.ATTRID=PMSCQ&
TKTSPEC.2.REID=101&
TKTSPEC.2.VALUE=RDPQ
于 2013-03-20T09:49:17.253 に答える