【问题标题】:creating XSLT from XML to convert into text file从 XML 创建 XSLT 以转换为文本文件
【发布时间】:2013-03-20 09:35:43
【问题描述】:

我是 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 样式表。我是这个地区的新手。欢迎您的宝贵回答。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    如果您只想列出TKT 的子元素,其节点名称后跟=、它们的值以及除最后一行之外的所有行上的&amp;,这应该可以:

    <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
    

    【讨论】:

    • 再次感谢您的回复。我正在尝试更改 XSLT 以适应另一种情况。考虑我的输入现在已使用 TKTSPEC 值更新,我正在尝试根据您的 xslt 提出输出。这有可能实现吗?
    猜你喜欢
    • 2016-11-06
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多