我有一个XML文档,必须根据节点的值进行过滤,然后必须以JSON格式返回匹配节点的父节点及其所有子节点。基于节点值过滤XML并使用XSLT转换为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 PR ocessor。
我正在按预期得到结果。有没有其他方法可以获得理想的结果?建议感激。
的哪个版本撒克逊你在用吗?对XSLT和XPath 3.0/3.1中的XML到JSON和JSON序列化有一些新的支持,因此您可以使用9.6或9.7版本,具体取决于版本和版本。 –
@MartinHonnen我正在使用'Saxon HE 9.6.0.7'。我必须研究Xpath 3.0的新功能。 – Beginner