Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何基于xslt中的if条件从json中获取相应的值_Json_Xslt_Xslt 2.0_Xslt 3.0 - Fatal编程技术网

如何基于xslt中的if条件从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" } },

我在下面给出了一个输入json

[
    {
        "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']?_}