【问题标题】:Preserve space coming in data in XSLT在 XSLT 中保留数据中的空间
【发布时间】:2013-10-04 07:57:27
【问题描述】:

我有这样的数据

<Table1>
 <row_description>Low Touch</row_description>
 <_x0038_ />
 <_x0039_ />
 <_x0031_0 />
 <_x0031_1 />
 <_x0031_2 />
</Table1>
<Table1>
 <row_description>    DMA/ALGO</row_description>
 <_x0038_ />
 <_x0039_ />
 <_x0031_0 />
 <_x0031_1 />
 <_x0031_2 />
</Table1>
<Table1>
 <row_description>    PT</row_description>
 <_x0038_ />
 <_x0039_ />
 <_x0031_0 />
 <_x0031_1 />
 <_x0031_2 />
</Table1>

而我的 XSLT 就是这样做的

<xsl:for-each select="*">
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <xsl:if test="position()=1">
            <Paragraph>
                <Span>
                    <Run>
                      <xsl:value-of select="text()" />
                    </Run>
                </Span>
            </Paragraph>
        </xsl:if>
        <xsl:if test="position()>1">
            <Paragraph TextAlignment="Right">
                <Span>
                    <Run>
                        <xsl:value-of select="text()"/>
                    </Run>
                </Span>
            </Paragraph>
        </xsl:if>
    </TableCell>
</xsl:for-each>

但它正在删除我的文本 PTPT 之前的空间。如何保留数据中的空间?

【问题讨论】:

    标签: c# xml vb.net xslt


    【解决方案1】:

    在您的 XSLT 中使用:

    <xsl:preserve-space elements="*" />
    

    见:http://www.w3schools.com/xsl/el_preserve-space.asp


    当我有以下输入 XML 时:

    <?xml version="1.0" encoding="UTF-8"?>
    <data>
        <Table1>
            <row_description>Low Touch</row_description>
            <_x0038_/>
            <_x0039_/>
            <_x0031_0/>
            <_x0031_1/>
            <_x0031_2/>
        </Table1>
        <Table1>
            <row_description>    DMA/ALGO</row_description>
            <_x0038_/>
            <_x0039_/>
            <_x0031_0/>
            <_x0031_1/>
            <_x0031_2/>
        </Table1>
        <Table1>
            <row_description>    PT</row_description>
            <_x0038_/>
            <_x0039_/>
            <_x0031_0/>
            <_x0031_1/>
            <_x0031_2/>
        </Table1>
    </data>
    

    我使用以下 XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="html" encoding="UTF-8" indent="yes"/>
        <xsl:preserve-space elements="*" />
    
        <xsl:template match="@*|node()">
            <xsl:apply-templates select="@*|node()" />
        </xsl:template>
    
        <xsl:template match="Table1">
            <xsl:for-each select="*">
                <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
                    <xsl:if test="position()=1">
                        <Paragraph>
                            <Span>
                                <Run>
                                  <xsl:value-of select="text()" />
                                </Run>
                            </Span>
                        </Paragraph>
                    </xsl:if>
                    <xsl:if test="position()>1">
                        <Paragraph TextAlignment="Right">
                            <Span>
                                <Run>
                                    <xsl:value-of select="text()"/>
                                </Run>
                            </Span>
                        </Paragraph>
                    </xsl:if>
                </TableCell>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    

    输出按预期显示:

    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph><Span><Run>Low Touch</Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph><Span><Run>    DMA/ALGO</Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph><Span><Run>    PT</Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    <TableCell Padding="10,1" BorderThickness="1,1,1,1" BorderBrush="#FF888888">
        <Paragraph TextAlignment="Right"><Span><Run></Run>
            </Span></Paragraph>
    </TableCell>
    

    &lt;Run&gt; PT&lt;/Run&gt; 中仍然有空格。作为 XSLT 处理器,我使用了 Altova XMLSpy。

    【讨论】:

    • 做到了。问题是一样的。我在这里添加了它&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:preserve-space elements="*" /&gt;
    • @NikhilAgrawal 这很奇怪。我用一个示例 XSLT 更新了我的答案。以及示例输入和输出。如您所见,空间被保留。也许问题出在您的 XSLT 处理器上?
    • 请看我的回答。谢谢你的帮助。来自我的 +1。
    【解决方案2】:

    我是 OP,我这样做是为了解决我的问题

    <Run xml:space="preserve"><xsl:value-of select="text()" /></Run>
    

    注意:写完xml:space="preserve"后,请确保&lt;xsl:value-of select="text()" /&gt;在同一行。如果我们这样写

    <Run xml:space="preserve">
        <xsl:value-of select="text()" />
    </Run>
    

    它还会将 xsl 的缩进视为文本,正如我们所说的以保留空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2019-01-11
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多