【发布时间】:2016-08-19 10:48:00
【问题描述】:
我有一个 XML 文档,我必须根据节点的值对其进行过滤,然后必须以 JSON 格式返回匹配节点的父节点及其所有子节点。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<col-name name="col1Name" />
<col-name name="col2Name" />
<row>
<col>Test1</col>
<col>Test2</col>
</row>
<row>
<col>Test3</col>
<col>Test4</col>
</row>
</root>
XSL:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
{
"filtered-result": [
<xsl:for-each select="//row[col[normalize-space(text()) = 'Test2']]">
<xsl:variable name="columnCount" select="count(./*)" />
{
<xsl:for-each select="./*">
<xsl:variable name="columnIndex" select="position()" />
"<xsl:value-of select="normalize-space(//col-name[$columnIndex]/@name)" />": "<xsl:value-of select="." />"<xsl:if test="$columnIndex < $columnCount">,</xsl:if>
</xsl:for-each>
}<xsl:if test="./following-sibling::*">,</xsl:if>
</xsl:for-each>
]
}
</xsl:template>
</xsl:transform>
输出:
{
"filtered-result": [
{
"col1Name": "Test1",
"col2Name": "Test2"
}
]
}
我使用 SAXON 作为 XSLT 处理器。
我得到了预期的结果。有没有其他方法可以得到想要的结果?建议表示赞赏。
【问题讨论】:
-
您使用的是哪个版本的 Saxon?在 XSLT 和 XPath 3.0/3.1 中有一些对 XML 到 JSON 和 JSON 序列化的新支持,因此您可能可以在 9.6 或 9.7 中使用它,具体取决于版本和版本。
-
@MartinHonnen 我正在使用
Saxon HE 9.6.0.7。我必须研究 Xpath 3.0 的新功能。
标签: json xml xslt xslt-2.0 saxon