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

Result file shows values that are not part of element matches

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

问题:

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

假设:

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

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

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

XSLT fiddle 已关闭,所以这次我只是 post 下面的代码:

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 数据内容应该用没有匹配模板的其他节点扩展,这种期望也是有效的。

因为内置的模板规则。

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

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

一个选项是添加:

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

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

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

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