从XML创建XSLT以转换为文本文件

时间:2013-03-20 09:35:44

标签: xml xslt

我是XSLT的新手。在我的任务之一中,我必须将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样式表。我是这个领域的新手。欢迎您提出宝贵的答案。

1 个答案:

答案 0 :(得分: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