结果文件显示不属于元素匹配的值
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 中,您可以使用<xsl:mode on-no-match="..."/>
定义许多处理不匹配项的策略。默认策略是将数据从源复制到结果。替代选项包括从输出中删除数据,或引发错误。
【讨论】:
以上是关于结果文件显示不属于元素匹配的值的主要内容,如果未能解决你的问题,请参考以下文章
当同一列中的值不匹配但不同列重复时将返回结果的 SQL 查询
jQuery UI 自动完成 - 输入与结果集不匹配时不显示结果