应用于 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>
还可以简单地考虑使用文字结果元素(例如<results><names>...
)而不是 xsl:element(例如<xsl:element name="results"><xsl:element name="names">...
),因为只有在您需要在运行时计算元素名称时才需要后者。
【讨论】:
以上是关于应用于 XML 文件时 XSL 不返回值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XSL-FO(和 Apache FOP)计算从应用模板返回的元素