结果文件显示不属于元素匹配的值
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="..."/>
定义许多处理不匹配项的策略。默认策略是将数据从源复制到结果。其他选项包括从输出中删除数据或引发错误。
使用 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="..."/>
定义许多处理不匹配项的策略。默认策略是将数据从源复制到结果。其他选项包括从输出中删除数据或引发错误。