手动创建XSLT

时间:2015-11-09 05:48:39

标签: xslt xml-parsing

我是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

1 个答案:

答案 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>