输入(我编辑了输入和输出以便更好地理解)
<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>
如您所见,行/行中的内容丢失了。我究竟做错了什么?此外,他没有贯穿所有行/行。行中可以有多个子行,我需要全部。
(我需要更多细节,我的帖子主要包含代码。)
答案 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>