XSLT在文本输出中删除所有选项卡

时间:2014-02-05 20:45:36

标签: xslt formatting

傻,简单的问题。当我输出文本时,它仍然根据我的格式化/缩进XSL结构获取选项卡。如何指示变换器忽略样式表中的间距,同时保持格式整齐?

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

      <xsl:template match="/">
        <xsl:apply-templates select="Foo/Bar"></xsl:apply-templates>
      </xsl:template>
      <xsl:template match="Bar">   
<xsl:for-each select="AAA"><xsl:for-each select="BBB"><xsl:value-of select="Label"/>|<xsl:value-of select="Value"/><xsl:text>&#10;</xsl:text></xsl:for-each></xsl:for-each>
</xsl:template>

      </xsl:stylesheet>

逐行生成输出,没有标签:

SomeLabel|SomeValue
SomeLabel|SomeValue
SomeLabel|SomeValue


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

  <xsl:template match="/">
    <xsl:apply-templates select="Foo/Bar"></xsl:apply-templates>
  </xsl:template>
  <xsl:template match="Bar">   
    <xsl:for-each select="AAA">   
        <xsl:for-each select="BBB">   
            <xsl:value-of select="Label"/>|<xsl:value-of select="Value"/>
             <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>

  </xsl:template>

  </xsl:stylesheet>

使用标签生成输出:

SomeLabel|SomeValue
    SomeLabel|SomeValue
    SomeLabel|SomeValue

更新 添加这个并不能解决问题:

<xsl:output method="text" indent="no"/>
  <xsl:strip-space elements="*"></xsl:strip-space> 

这是设计的,但您可以想象XML看起来像这样:

<Foo>
  <Bar>
    <AAA>
      <BBB>
        <Label>SomeLabel1</Label>
        <Value>SomeValue1</Value>
      </BBB>
      <BBB>    
        <Label>SomeLabel2</Label>
        <Value>SomeValue2</Value>
      </BBB>
      <BBB>
        <Label>SomeLabel3</Label>
        <Value>SomeValue3</Value>
      </BBB>
    </AAA>
  </Bar>
</Foo>

1 个答案:

答案 0 :(得分:0)

您可以尝试将所有当前文本节点包装在 xsl:text 中。例如,试试这个

  <xsl:for-each select="BBB">
    <xsl:value-of select="Label"/>
     <xsl:text>|</xsl:text>
     <xsl:value-of select="Value"/>
     <xsl:text>|</xsl:text>
  </xsl:for-each>

或者,您可以使用 concat 函数。

  <xsl:for-each select="BBB">
    <xsl:value-of select="concat(Label, '|')"/>
    <xsl:value-of select="concat(Value, '|')"/>
  </xsl:for-each>

如果您愿意,您甚至可以将两个陈述合并为一个

  <xsl:for-each select="BBB">
    <xsl:value-of select="concat(Label, '|', Value, '|')"/>
  </xsl:for-each>

编辑:如果您不想多次输入分隔符|,则可以使用模板匹配来输出文件。首先,将替换为 apply-templates ,如此

    <xsl:for-each select="BBB">   
        <xsl:apply-templates select="Label"/>
        <xsl:apply-templates select="Value"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>

然后你会有一个特定的模板来匹配标签,你不需要输出分隔符,另一个更通用的模板匹配任何 BBB <的孩子/ p>

<xsl:template match="BBB/Label" priority="1">
   <xsl:value-of select="." />
</xsl:template>

<xsl:template match="BBB/*">
   <xsl:text>|</xsl:text><xsl:value-of select="." />
</xsl:template>

(此处需要优先级以确保标签与第一个模板匹配,而不是一般模板匹配)。当然,在这种情况下,您也可能无法在标签上执行应用模板,只需执行 xsl:value-of

此外,如果字段按照它们出现在XML中的顺序输出,您可以将 for-each 简化为此

    <xsl:for-each select="BBB">   
        <xsl:apply-templates />
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>