XSLT使用select-value缺少内容

时间:2018-06-12 12:53:39

标签: xml xslt

输入(我编辑了输入和输出以便更好地理解)

<csv>
<row>
    <id>a</id>
    <more>1</more>
    <stuff>123</stuff>
    <row>
        <id>1345</id>
        <stuff>dga</stuff>
    </row>
    <row>
        <id>68968</id>
        <stuff>jkjh</stuff>
    </row
</row>
<row>
    <id>b</id>
    <more>12</more>
    <stuff>asdf</stuff>
    <row>
        <id>abhz</id>
        <stuff>ghjk</stuff>
    </row>
</row>
</csv>

期望的输出

<csv>
    <bamboo id="a" more="1">
        <p>123</p>
    </bamboo>
    <bamboo id="1345">
        <p>dga</p>
    </bamboo>
    <bamboo id="68968>
        <p>jkjh</p>
    <bamboo id="b" more="12">
        <p>asdf</p>
    </bamboo>
    <bamboo id="abhz">
        <pghjk</p>
    </bamboo>
</csv>

我的尝试:

<?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" exclude-result-prefixes="xs" version="1.0">
    <xsl:template match="csv">
    <somelementshere>
        <text>
            <body>
                <div type="bamboopower">
                        <xsl:apply-templates select="@* | node()"/>
                </div>
            </body>
        </text>
    </somelementshere>
</xsl:template>
<xsl:template match="row">

    <bamboo id="{id}" more="{1}">
        <p><xsl:value-of select="stuff"/></p>
    </bamboo>

    <bamboo id="row/row[comment_id]">
        <p><xsl:value-of select="row/row/stuff"/></p>
    </bamboo>
</xsl:template>
</xsl:stylesheet>

我的输出如下:

            <bamboo id="a" more="1">
                <p>123</p>
            </bamboo>
            <bamboo id="">
                <p/>
            </bamboo>
            <bamboo id="b" more="12">
                <p>123</p>
            </bamboo>
            <bamboo id="">
                <p/>
            </bamboo>

如您所见,行/行中的内容丢失了。我究竟做错了什么?此外,他没有贯穿所有行/行。行中可以有多个子行,我需要全部。

(我需要更多细节,我的帖子主要包含代码。)

1 个答案:

答案 0 :(得分:2)

你遇到的一个问题就是这个表达......

gedit /etc/profile

export PATH="$PATH:/opt/petalinux-v2015.4-final/tools/linux-i386/arm-xilinx-gnueabi/bin"

export PATH="$PATH:/opt/Xilinx/SDK/2015.4/gnu/arm/lin/bin/"

#export PATH="$PATH:/usr/local/gcc-linaro-7.2.1-2017.11-x86_64_arm-eabi/bin"
#export PATH="$PATH:/usr/local/gcc-linaro-7.2.1-2017.11-x86_64_arm-eabi/libexec/gcc/arm-eabi/7.2.1"

您目前正在匹配<xsl:value-of select="row/row/stuff"/> 元素,因此您的表达式将与此相关,因此通过执行row您正在寻找&#34; grand-child&#34;元素称为行。你真的只做row/row

这与为第二个<xsl:value-of select="row/stuff"/>创建id属性类似。它应该是这样的(我已将bamboo替换为comment_id,因为您的XML中没有id

comment_id

第二个问题是您的代码只假设一个子<bamboo id="{row/id}"> 元素,您可能有多个元素。要创建第二个row及其后续版本,您应将其包装在bamboo

试试这个XSLT

xsl:for-each

或者,您可以采用这种方法来删除一些重复编码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />

<xsl:template match="csv">
    <div type="bamboopower">
        <xsl:apply-templates select="@* | node()"/>
    </div>
</xsl:template>

<xsl:template match="row">
    <bamboo id="{id}" more="{more}">
        <p><xsl:value-of select="stuff"/></p>
    </bamboo>

    <xsl:for-each select="row">
        <bamboo id="{id}">
            <p><xsl:value-of select="stuff"/></p>
        </bamboo>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>