结果文件显示不属于元素匹配的值

Posted

技术标签:

【中文标题】结果文件显示不属于元素匹配的值【英文标题】:Result file shows values that are not part of element matches 【发布时间】:2021-08-10 02:22:18 【问题描述】:

使用 XSLT3.0,我正在使用“json-to-xml”解析 JSON 文件,从而生成 XML 映射。作为第二步,我创建一个元素,添加命名空间前缀并分配属性。我故意在 JSON 文件中添加了比匹配“ix_hidden”的模板更多的数据。

问题:

如果我没有匹配“其他”的模板,为什么输出文件包含来自 JSON 对象“其他”的 2 个值?

假设:

我知道第一个模板转换了名为“data”的完整节点,因此 XML 映射的解析结果包含元素“Other”及其子元素。

到目前为止,我的假设是 XSL 文件充当源文件和输出文件之间的防火墙,这意味着除非存在与指定表达式模式匹配的给定模板(在模板中匹配属性值),否则没有任何东西可以通过。如果匹配,则执行模板内的所有内容。

您能否澄清一下上述问题并可能显示代码更正以确保 XSL 中所有不匹配的数据都从输出中排除?

XSLT fiddle 已失效,所以这次我只发布以下代码:

JSON:

<data>

  "ix_hidden": 
    "CompanyName": "Company Limited",
    "OrganisationNumber": "123"
  ,

  "Other": 
    "Milk": 2,
    "Water": 5
  

</data>

XSL:

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

<xsl:transform version="3.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ix="http://www.example.com/1"
  xmlns:xbrli="http://www.example.com/2"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes="fn"
  expand-text="yes"
>

  <xsl:output method="xml" indent="yes"/>

  <!-- Attribute-sets -->

  <xsl:attribute-set name="ix-hidden">
    <xsl:attribute name="contextRef">period0</xsl:attribute>
  </xsl:attribute-set>

  <!-- Parse JSON to XML, results in XML map -->

  <xsl:template match="data">
      <xbrli:xbrl>
        <xsl:apply-templates select="json-to-xml(.)/*"/>
      </xbrli:xbrl>
  </xsl:template>

  <!-- Create IX hidden element  -->

  <xsl:template match="*[@key = 'ix_hidden']//*[@key and not(*)]">
      <xsl:element name="ix:@key" use-attribute-sets="ix-hidden">.</xsl:element>
  </xsl:template>

</xsl:transform>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<xbrli:xbrl xmlns:ix="http://www.example.com/1" xmlns:xbrli="http://www.example.com/2">
  <ix:CompanyName contextRef="period0">Company Limited</ix:CompanyName>
  <ix:OrganisationNumber contextRef="period0">123</ix:OrganisationNumber>
  25
</xbrli:xbrl>

预期结果:

应该只执行匹配的模板,因此关闭标记“xbrli:xbrl”之前的值 2 和 5 不可见。如果 JSON 数据内容应该使用没有匹配模板的其他节点进行扩展,这种期望也是有效的。

【问题讨论】:

【参考方案1】:

这是因为内置的模板规则。

在 XSLT 3.0 中,默认值为 text-only-copy

看看https://www.w3.org/TR/xslt-30/#built-in-rule。

一种选择是添加:

<xsl:mode on-no-match="shallow-skip"/>

【讨论】:

【参考方案2】:

“到目前为止,我的假设是 XSL 文件充当源文件和输出文件之间的防火墙,这意味着除非存在与指定表达式模式匹配的给定模板(在模板中匹配属性值),否则任何东西都不应通过。”

恐怕这个假设是完全错误的。

在 XSLT 3.0 中,您可以使用&lt;xsl:mode on-no-match="..."/&gt; 定义许多处理不匹配项的策略。默认策略是将数据从源复制到结果。替代选项包括从输出中删除数据,或引发错误。

【讨论】:

以上是关于结果文件显示不属于元素匹配的值的主要内容,如果未能解决你的问题,请参考以下文章

如何等待动态加载元素列表

matlab检查不匹配分隔符

当同一列中的值不匹配但不同列重复时将返回结果的 SQL 查询

jQuery UI 自动完成 - 输入与结果集不匹配时不显示结果

['1','2','3'].map(parseInt)结果到底是啥?

C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配