【问题标题】:Cannot get out value from JSON data无法从 JSON 数据中获取价值
【发布时间】:2021-11-04 10:44:23
【问题描述】:

在 XSLT 中解析 JSON 数据并尝试获取指定的键值。我已经控制了 XSLT 在解析 JSON 时生成的 XML 映射,并且确实找到了值为“car”的键。

问题:我没有在结果中得到预期值。

您可以在此处找到代码:xsltfiddle

此处添加相同的代码:

JSON:

<data>
{
  "storage": {
    "car": "Volvo"
  }
}
</data>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    
    <xsl:output method="xml" indent="yes" html-version="5"/>
    
    <!-- Block all data that has no user defined template -->
    <xsl:mode on-no-match="shallow-skip"/>
    
    <!-- Transform JSON to XML -->
    <xsl:template match="data">
      <xsl:apply-templates select="json-to-xml(.)/*"/>
      <!-- Select -->
      <xsl:value-of select="//*[@key='car']"/>
    </xsl:template>
    
    <!-- Print map -->
  
  <!--  
  <xsl:template match="*[@key = 'storage']"> 
    <xsl:copy-of select=".."/> 
  </xsl:template> 
  -->
  
</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>

想要的结果

<?xml version="1.0" encoding="UTF-8"?>
Volvo

【问题讨论】:

    标签: xml xslt xslt-3.0


    【解决方案1】:

    我不会为此将 JSON 转换为 XML:我会将其解析为 XDM 映射,然后在映射中查找值。因此:

    <xsl:value-of select="parse-json(.)?storage?car"/>
    

    【讨论】:

    • 我认为这是一个很好的建议,如果以及何时提取单个值,显然该值在层次结构中的位置。根据我的问题,这是有道理的,即使它被大量剥离。仍然不明白为什么我的代码不起作用。
    【解决方案2】:

    你在评论中写道:

    仍然不明白为什么我的代码不起作用

    事实上,我们经常犯的错误是给你提供有效的代码,却没有告诉你你做错了什么。

    你的错误在这里:

       <xsl:apply-templates select="json-to-xml(.)/*"/>
       <xsl:value-of select="//*[@key='car']"/>
    

    您有两条指令,并且您期望第二条指令对第一条指令的结果进行操作。但这不是 XSLT 的工作方式。这些指令中的每一个都适用于相同的输入(具体来说,它们中的每一个都将源文档中的data 元素作为输入)。所以//*[@key='car'] 没有选择任何内容,因为在原始源文档中没有任何内容与此匹配。

    如果你想让第二条指令应用到第一条指令的结果,你可以把第一条指令的结果放在一个变量中:

    <xsl:variable name="converted-input">
       <xsl:apply-templates select="json-to-xml(.)/*"/>
    </xsl:variable>
    <xsl:value-of select="$converted-input//*[@key='car']"/>
    

    或者,就像@sspsujit 所做的那样,您可以将其全部折叠成一条指令,因为xsl:apply-templates 实际上并没有做任何感兴趣的事情。

    【讨论】:

      【解决方案3】:

      我认为你需要这个:

      <!-- Transform JSON to XML -->
      <xsl:template match="data">
        <!-- Select -->
        <xsl:value-of select="json-to-xml(.)//*[@key='car']"/>
      </xsl:template>
      

      得到:

      <?xml version="1.0" encoding="UTF-8"?>Volvo
      

      【讨论】:

        猜你喜欢
        • 2017-02-13
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 2018-04-03
        • 2018-11-30
        • 1970-01-01
        • 2013-04-11
        • 2020-10-21
        相关资源
        最近更新 更多