我是XSL概念的新手,我正在尝试为以下XML创建一个XSLT,
<?xml version="1.0" encoding="UTF-8"?>
<row>
<c1>1234</c1>
<c2>A</c2>
<c2 m="1" s="2">321</c2>
<c2 m="1" s="3">654</c2>
<c2 m="1" s="4">098</c2>
<c2 m="2">B</c2>
<c2 m="3">C</c2>
<c2 m="3" s="2">123</c2>
<c2 m="4">5</c2>
<c3 />
</row>
如果使用XSL进行转换,那么我应该得到如下输出,
1234 A \ 321 \ 654 \ 098] B] C \ 123] 5
我已尝试创建自己的,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="row">
<array />
<xsl:apply-templates />
</xsl:template>
<xsl:template match="c1">
<data>
<xsl:attribute name="attribute">1</xsl:attribute>
<xsl:attribute name="value">
<xsl:number level="single" />
</xsl:attribute>
<xsl:attribute name="subvalue">1</xsl:attribute>
<xsl:value-of select="." />
</data>
</xsl:template>
<xsl:template match="c2">
<data>
<xsl:attribute name="attribute">1</xsl:attribute>
<xsl:attribute name="value">
<xsl:number level="single" />
</xsl:attribute>
<xsl:attribute name="subvalue">1</xsl:attribute>
<xsl:value-of select="." />
</data>
</xsl:template>
</xsl:stylesheet>
但我得到的输出如下,
1234 A 321 654 098 B C 123 5
请帮助我创建XSL
答案 0 :(得分:0)
这一切都让人很困惑。您的XSLT生成具有各种属性的<array>
和<data>
元素,但您所需的输出中没有此类元素或属性。实际上,您的示例代码似乎与您期望的输出完全没有关系。
总是很难从一个例子中反向设计需求,但我这样做的尝试是:
输出row
元素
如果@m1
大于之前的@m1
,则在字符串值前加上“]”
如果@m1
等于之前的@m1
,请在其前面加上“\”
如果没有@m1
,则在其前面加上一个空格。
如果我的猜测与标记接近,那么解决方案将如下所示:
<xsl:template match="row">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="row/*[@m1 > preceding-sibling::*[1]/@m1]">
<xsl:value-of select="concat(']', .)"/>
</xsl:template>
<xsl:template match="row/*[@m1 = preceding-sibling::*[1]/@m1]">
<xsl:value-of select="concat('\', .)"/>
</xsl:template>
<xsl:template match="row/*[not(@m1)]">
<xsl:value-of select="concat(' ', .)"/>
</xsl:template>