将XML转换为3个单元格的HTML行,但会获得不需要的空格

时间:2013-06-16 22:56:40

标签: xml xslt-1.0

有人可以帮忙吗?我是XSLT的新手,我正在尝试构建一个元素表;我在下面简化了我的例子,并设法将输出输出到三个单元格的行上,但是我在行之间得到了不需要的空格 - 有谁能告诉我这里我做错了什么?

我的匹配中还需要两个<apply-templates />吗?

非常感谢, 亚历

这是XML:

<?xml version="1.0" encoding="iso-8859-1"?>
    <products>
        <r t='title1'>...</r>
        <r t='title2'>...</r>
        <r t='title3'>...</r>
        <r t='title4'>...</r>
        <r t='title5'>...</r>
        <r t='title6'>...</r>
        <r t='title7'>...</r>
        <r t='title8'>...</r>
        <r t='title9'>...</r>
    </products>

这是XSL:

<!-- Rows -->
<xsl:template match="r[position() mod 3 = 1]">
    <div class="row">
        <xsl:apply-templates mode="cell" select="." />
        <xsl:apply-templates mode="cell" select="./following-sibling::r[not(position() > 2)]" />
    </div>
</xsl:template>

<!-- Cells -->
<xsl:template match="r" mode="cell">
    <div class="cell">
        <xsl:value-of select="@t"/>
    </div>
</xsl:template>

MY OUTPUT(注意行之间不需要的空格):

<div class="row">
    <div class="cell">Title1</div>
    <div class="cell">Title2</div>
    <div class="cell">Title3</div>
</div>









<div class="row">
    <div class="cell">Title4</div>
    <div class="cell">Title5</div>
    <div class="cell">Title6</div>
</div>









<div class="row">
    <div class="cell">Title7</div>
    <div class="cell">Title8</div>
    <div class="cell">Title9</div>
</div>

1 个答案:

答案 0 :(得分:0)

好吧,从那开始就不能是你的XML,因为那是无效的。 “有效”XML文件无法包含多个根元素。您的XML在根目录中有九个“r”元素。

在尝试使用XSLT处理之前先从有效的东西开始。

这个XSL(注意我添加了一个模板来消除任何text()的匹配,因为你的“...”会匹配:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="r[position() mod 3 = 1]">
    <div class="row">
        <xsl:apply-templates mode="cell" select="." />
        <xsl:apply-templates mode="cell" select="./following-sibling::r[not(position() > 2)]" />
    </div>
</xsl:template>

<xsl:template match="r" mode="cell">
    <div class="cell">
        <xsl:value-of select="@t"/>
    </div>
</xsl:template>

<xsl:template match="text()"/>
</xsl:stylesheet>

使用Saxon生成此输出(根本没有新行):

<?xml version="1.0" encoding="utf-8"?><div class="row"><div class="cell">title1</div><div class="cell">title2</div><div class="cell">title3</div></div><div class="row"><div class="cell">title4</div><div class="cell">title5</div><div class="cell">title6</div></div><div class="row"><div class="cell">title7</div><div class="cell">title8</div><div class="cell">title9</div></div>

如果添加&lt; xsl:output indent =“yes”/&gt;对此,您将获得您期望的确切输出。除非为&lt; products&gt;指定匹配项,否则您还会获得无效的XML输出输出根标签。