xslt:xml到文本转换

时间:2016-07-02 00:01:53

标签: xslt-1.0

我是xslt的新手,下面是xml输入

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ser="http://xyz.com.zr/l8q/12Q/service/">
    <soapenv:Header>
        <ser:User>
            <!-- comment -->
            <Username/>
            <password/>
        </ser:User>
    </soapenv:Header>
    <soapenv:Body>
        <mainTag>
            <abc>1596056</abc>
            <asdd>12434F</asdd>
            <childtag>
                <asdf>1233</asdf>
                <qwe>567</qwe>
            </childtag>
        </mainTag>
    </soapenv:Body>
</soapenv:Envelope>

以下是所需的输出(文本)

01|1596056|12434F
02|1233| |567|

总而言之,想要实现所需的输出,需要知道以下细节

1) how can i make the text output from xslt.
2) how to make/avoid newline (i.e break).
3) how to generate spaces in text.

以下是逻辑

01      =   this is line number in the text (first line)
1596056 =   <abc>
12434F  =   <asdd>

02      =   this is line number in the text (second line)
1233    =   <asdf>
567     =   <qwe>

由于

1 个答案:

答案 0 :(得分:0)

你的逻辑有点不一致,但我不打算详述。相反,我已经编写了一个产生输出的xsl并回答了你的目标1)2)和3)。我在相关代码点嵌入了评论。

这些是xslt的基本概念,所以如果你不能遵循它,我建议你做一些关于使用xslt的背景阅读。有很多资源可以解决这个问题。http://www.w3schools.com让人想起来,但当然网络上会有更多资源。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

<!-- 1) output method is "text" -->
<xsl:output method="text" version="1.0" encoding="UTF-8"/>

<!-- identity transform,  apply templates without output  -->
<xsl:template match="@*|node()">
    <xsl:apply-templates select="@*|node()"/>
</xsl:template>

<!-- matches on soap envolpe body Body for the namespace http://schemas.xmlsoap.org/soap/envelope/ -->
<xsl:template match="s:Body">
    <!-- list of tags that you want to count -->
    <xsl:apply-templates select="mainTag | mainTag/childtag "/>
</xsl:template>

<xsl:template match="mainTag">
    <!-- output context position from within nodeset specified with the apply-templates above-->
    <xsl:value-of select="concat('0',position())"/>
    <xsl:text>|</xsl:text>
    <xsl:value-of select="abc"/>
    <xsl:text>|</xsl:text>
    <xsl:value-of select="asdd"/>
    <!-- 2) new line using entity -->
    <xsl:text>&#13;</xsl:text>
</xsl:template>

<xsl:template match="childtag">
    <xsl:value-of select="concat('0',position())"/>
    <xsl:text>|</xsl:text>
    <xsl:value-of select="asdf"/>
    <!-- 3) you can include a space within the xsl:text  -->
    <xsl:text>| |</xsl:text>
    <xsl:value-of select="qwe"/>
    <xsl:text>|</xsl:text>
    <!-- 2) new line using entity -->
    <xsl:text>&#13;</xsl:text>
</xsl:template>

</xsl:stylesheet>