2013-03-20 84 views
0

我是XSLT新手。在我的一个任务中,我必须将XML文件转换为具有特定格式的文本文件。我想知道有没有一种简单/快速的方法来完成它。从XML创建XSLT转换为文本文件

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

如果你只是想列出的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 
+0

谢谢,作品完美。 – user2190101 2013-03-20 09:59:21

+0

太好了。请记住点击旁边的复选标记来接受此答案。 :) – JLRishe 2013-03-20 10:08:45

+0

再次感谢您的答复.. 我想改变XSLT以适应另一种情况。 考虑我现在用TKTSPEC值更新的输入,我想根据你的xslt提出一个输出。这有可能实现吗? – user2190101 2013-03-22 10:11:04