【问题标题】:Unexpected results from XSLT (new user) [duplicate]XSLT(新用户)的意外结果[重复]
【发布时间】:2019-08-30 03:08:55
【问题描述】:

请帮助我理解为什么我第一次尝试 XSLT 转换并没有产生我期望的结果。

这是我的 XML 输入:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="partition_table.xsl"?>

<pl version="01.00.0000">
    <de name="s_b" ins="3">
        <pa name="BT" type="bct">
            <ap> sec </ap>
            <ft> b2 </ft>
            <s> 32768 </s>
            <fsa> 0 </fsa>
            <aa> 8 </aa>
            <r> 0 </r>
        </pa>
        <pa name="m1" type="mb">
            <ap> sec </ap>
            <ft> b2 </ft>
            <s> 262144 </s>
            <fsa> 0 </fsa>
            <aa> 8 </aa>
            <r> 0 </r>
            <f> MBF </f>
        </pa>
        <pa name="m1b" type="mb">
            <ap> sec </ap>
            <ft> b2 </ft>
            <s> 262144 </s>
            <fsa> 0 </fsa>
            <aa> 8 </aa>
            <r> 0 </r>
            <f> MBF </f>
        </pa>
    </de>
</pl>

这是我的 XSLT:

<?xml version="1.0" encoding="UTF-8"?>

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

<xsl:strip-space elements="ap fst s fsa aa r f" />
<xsl:template match="/">|N|T|AP|FST|S|FSA|AA|R|F|
|:---|:---|:-----------|:------|---:|-----------:|--------------:|-------:|:-------|
  <xsl:for-each select="pl/de/pa">|<xsl:value-of select="@n"/>|<xsl:value-of select="@t"/>|<xsl:value-of select="ap"/>|<xsl:value-of select="fst"/>|<xsl:value-of select="s"/>|<xsl:value-of select="fsa"/>|<xsl:value-of select="aa"/>|<xsl:value-of select="r"/> %|<xsl:value-of select="f"/>|
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我得到这个输出:

<?xml version="1.0" encoding="UTF-8"?>|N|T|AP|FST|S|FSA|AA|R|F|
|:---|:---|:-----------|:------|---:|-----------:|--------------:|-------:|:-------|
  ||| sec || 32768 | 0 | 8 | 0  %||
  ||| sec || 262144 | 0 | 8 | 0  %| MBF |
  ||| sec || 262144 | 0 | 8 | 0  %| MBF |

有两个问题。第一个是在输出开头出现&lt;?xml...?&gt; 标签。它不在 XSLT 中,因为我正在生成 markdown,所以我不想要它!

第二个问题是&lt;xsl:strip-space.../&gt; 标签被忽略了。我尝试了elements="*",但得到了相同的结果。

我正在使用https://xslttest.appspot.com/ 的 XSLT 测试工具进行测试。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    你应该在你的 xslt 上添加这些

    <xsl:output method="text" />
    

    这是您的完整 xslt 代码。

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text"/>
    
        <xsl:strip-space elements="ap fst s fsa aa r f" />
        <xsl:template match="/">|N|T|AP|FST|S|FSA|AA|R|F|
    |:---|:---|:-----------|:------|---:|-----------:|--------------:|-------:|:-------|
            <xsl:for-each select="pl/de/pa">|<xsl:value-of select="@n"/>|<xsl:value-of select="@t"/>|<xsl:value-of select="ap"/>|<xsl:value-of select="fst"/>|<xsl:value-of select="s"/>|<xsl:value-of select="fsa"/>|<xsl:value-of select="aa"/>|<xsl:value-of select="r"/> %|<xsl:value-of select="f"/>|
            </xsl:for-each>
        </xsl:template>
    
    </xsl:stylesheet>
    

    &lt;xsl:strip-space 仅适用于节点。访问此site

    我认为你需要的是

    select="normalize-space(.)"
    

    【讨论】:

    • 其实用method="text",就不用说omit-xml-declaration="yes"和indent="no"了,因为生成纯文本时永远不会得到XML声明或缩进。
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2014-10-09
    • 1970-01-01
    • 2019-05-14
    • 2011-09-04
    • 1970-01-01
    • 2017-10-04
    • 2014-12-01
    相关资源
    最近更新 更多