在一行中为每个元素打印xml节点

时间:2018-11-24 17:31:57

标签: node.js xml xslt foreach

我需要通过xslt将此xml中所有节点的类别和小时值打印为单行中的逗号分隔值-

XML

    <?xml version="1.0" encoding="UTF-8"?>
<course>   
    <subcourse>
        <code>ABC</code>
        <name>REFCOURSE</name>
        <date>Date</date>
        <category>SDF</category>
        <hours>7</hours>
    </subcourse>
    <subcourse>
        <code>DEF</code>
        <name>ORIGCOURSE</name>
        <date>Date</date>
        <category>UIT</category>
        <hours>9</hours>
    </subcourse>
    </course>

需要的输出-

SDF,7,UIT,9

在stakoverflow的帮助下,这是我到目前为止所做的-

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  version="2.0">

    <xsl:param name="range-1-begin"  select="4"/>
    <xsl:param name="range-1-end"  select="5"/>

    <xsl:param name="range-2-begin"  select="6"/>
    <xsl:param name="range-2-end"  select="7"/>


    <xsl:output method="text" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        </xsl:template>

        <xsl:template match="subcourse">
            <info><xsl:apply-templates/></info>
        </xsl:template>

        <xsl:template match="subcourse">
            <xsl:if test = "not(position()= 1)">
                <xsl:text>,</xsl:text>
            </xsl:if>
            <xsl:value-of select="."/>
        </xsl:template>


</xsl:stylesheet>

输出-ABCREFCOURSEDateSDF7,DEFORIGCOURSEDateUIT9

我需要它遍历每个子课程并选择类别和小时(如果存在)。我找不到如何仅选择类别和小时数。

1 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  version="2.0">
<xsl:template match="//subcource">
<xsl:if test="category">
<xsl:if test = "not(position()=1)">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:value-of select="category"/><xsl:text>,</xsl:text><xsl:value-of select="hours"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>