应用于 XML 文件时 XSL 不返回值

Posted

技术标签:

【中文标题】应用于 XML 文件时 XSL 不返回值【英文标题】:XSL not returning values when applied to XML file 【发布时间】:2021-12-30 18:47:12 【问题描述】:

我有这个 XML 文件:

<?xml version="1.0"?>
<parks>
    <park>
        <park_name>MCGUANE (JOHN)</park_name>
        <acres>10.3</acres>
    
    </park>
    <park>
        <park_name>ARMOUR (PHILIP) SQUARE</park_name>
        <acres>9.05</acres>
    </park>
    <park>
        <park_name>FULLER (MELVILLE)</park_name>
        <acres>11.31</acres>
    </park>
    <park>
        <park_name>CORNELL (PAUL) SQUARE</park_name>
        <acres>8.8</acres>
    </park>
    <park>
        <park_name>RUSSELL (MARTIN) SQUARE</park_name>
        <acres>10.05</acres>
    </park>
    <park>
        <park_name>SHERMAN (JOHN)</park_name>
        <acres>57.69</acres>
    </park>
    <park>
        <park_name>DAVIS (DR. NATHAN) SQUARE</park_name>
        <acres>8.91</acres>
    </park>
</parks>

我创建并使用了这个 XSL 文件来转换那个 XML 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
        <xsl:element name="results">
            <xsl:element name="names">
                <xsl:apply-templates select="parks/park">
                    <xsl:sort select="@name" order="ascending" />
                </xsl:apply-templates>
            </xsl:element>
        </xsl:element>
    </xsl:template>

    <xsl:template match="park_name" >
        <xsl:element name="park">
            <xsl:attribute name="name">
                <xsl:value-of select="park_name" />
            </xsl:attribute>
        
            <xsl:attribute name="acres">
                <xsl:value-of select="acres" />
            </xsl:attribute>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

这是我在转换原始 XML 文件后收到的文件:

<?xml version="1.0" encoding="UTF-8"?>
<results>
    <names>
        <park name="" acres=""/>
        10.3
        <park name="" acres=""/>
        9.05
        <park name="" acres=""/>
        11.31
        <park name="" acres=""/>
        8.8
        <park name="" acres=""/>
        10.05
        <park name="" acres=""/>
        57.69
        <park name="" acres=""/>
        8.91
    </names>
</results>

我希望转换后的文档看起来像这样并按字母顺序排序:

<results>
    <names>
        <park name="PARK NAME" acres="99.99"/>
    </names>
</results>

我不知道为什么转换后的 XML 文件中的名称和英亩属性不会存储原始 XML 文件中的值。

【问题讨论】:

【参考方案1】:

你在几个地方有错误的上下文和选择,使用

 <xsl:apply-templates select="parks/park">
                <xsl:sort select="park_name" order="ascending" />
 </xsl:apply-templates>

<xsl:template match="park">
  <park name="park_name" acres="acres"/>
</xsl:template>

还可以简单地考虑使用文字结果元素(例如&lt;results&gt;&lt;names&gt;...)而不是 xsl:element(例如&lt;xsl:element name="results"&gt;&lt;xsl:element name="names"&gt;...),因为只有在您需要在运行时计算元素名称时才需要后者。

【讨论】:

以上是关于应用于 XML 文件时 XSL 不返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSL-FO(和 Apache FOP)计算从应用模板返回的元素

Chrome不会将我的XSLT样式表应用于我的本地XML文件

xsl 祖先或自我不返回结果

XSLT for-each 无法提取值

如何在 Java 中将 xsl 应用于 xml

在 XML 中查找重复值并在 XSL 中删除节点