如何基于xslt中的if条件从json中获取相应的值
我在下面给出了一个输入json如何基于xslt中的if条件从json中获取相应的值,json,xslt,xslt-2.0,xslt-3.0,Json,Xslt,Xslt 2.0,Xslt 3.0,我在下面给出了一个输入json [ { "ns2:Field": [ { "_": "138045", "$": { "name": "dID" } },
[
{
"ns2:Field": [
{
"_": "138045",
"$": {
"name": "dID"
}
},
{
"_": "FinExmExportERToAPJobDef_405605",
"$": {
"name": "dDocTitle"
}
},
{
"_": "Document",
"$": {
"name": "dDocType"
}
}
]
},
{
"ns2:Field": [
{
"_": "FinExmExportERToAPJobDef_4056456",
"$": {
"name": "dDocTitle"
}
},
{
"_": "138078",
"$": {
"name": "dID"
}
},
{
"_": "Document",
"$": {
"name": "dDocType"
}
}
]
},
{
"ns2:Field": [
{
"_": "138085",
"$": {
"name": "dID"
}
},
{
"_": "FinExmExportERToAPJobDef_4056056",
"$": {
"name": "dDocTitle"
}
},
{
"_": "Document",
"$": {
"name": "dDocType"
}
}
]
}
]
从这个json中,我想要一个包含所有DID值的数组。
我的示例输出是
[138045, 138078, 138085]
如何从输入json创建此数组。我曾经尝试过使用choose,如果两者都给我空输出,那么何时甚至使用xslt。下面是我尝试过的xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="3.0" xmlns="http://www.w3.org/2005/xpath-functions" xpath-default-namespace="http://www.w3.org/2005/xpath-functions" expand-text="yes" >
<xsl:param name="input"/>
<xsl:output method="text"/>
<xsl:template name="xsl:initial-template">
<xsl:variable name="input-as-xml" select="json-to-xml($input)"/>
<xsl:variable name="transformed-xml" as="element(array)">
<array>
<xsl:for-each select='$input-as-xml//array[@key="ns2:Field"]'>
<map>
<string key="did">
<xsl:choose>
<xsl:when test="//map[@key='$']/string[@key='name'] = 'dID'">
<xsl:value-of select="./string[@key='_']"/>
</xsl:when>
</xsl:choose>
</string>
</map>
</xsl:for-each>
</array>
</xsl:variable>
<xsl:value-of select="xml-to-json($transformed-xml)"/> </xsl:template>
</xsl:stylesheet>
由于无法创建数组,我考虑将每个did的值放入did键值对中。
但我仍然没有得到它的价值。有人能告诉我如何遍历json来获取所有did值吗。这是一种奇怪的格式,但看起来好像
<xsl:output method="json"/>
<xsl:template match="/">
<xsl:variable name="json-xml" select="json-to-xml($json)"/>
<xsl:variable name="array"
select="array {
$json-xml/array/map/array[@key = 'ns2:Field']/map[map[@key = '$'][string[@key = 'name'] = 'dID']]/string[@key = '_']/number() }"/>
<xsl:sequence select="$array"/>
</xsl:template>
如果您将解析json($json)的结果作为初始匹配选择。您不需要首先将其转换为XML,您可以这样做
array{?*?('ns2:Field')?*[?('$')?name='dID']?_}
使用Saxon 10测试:使用JSON输出方法生成
["138045","138078","138085"]
当然,其中棘手的部分是调试。我第一次没弄好!这有助于了解可以围绕表达式的任何部分包装对trace()的调用以获得部分结果。在我的第一次尝试中,我拼错了“ns2:Field”,像这样的跟踪很快让我明白了:
array{trace(?*?('ns2:field'))?*[?('$')?name='dID']?_}
array{trace(?*?('ns2:field'))?*[?('$')?name='dID']?_}