【发布时间】:2018-08-15 12:20:24
【问题描述】:
我正在尝试使用以下步骤创建一个转换 XML 的 XSL:
- 确定根“properties”下的元素是否具有以“foo”开头的名称。如果它不以 'foo' 开头,则删除该元素。
- 创建名为“entry”的新元素,其属性“key”等于以“foo”开头的元素名称。
如果看起来更容易,该过程也可以按照指定步骤的相反顺序进行。
XML 文档
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<oof>AAA</oof>
<bar>BBB</bar>
<foobar>CCC</foobar>
<barfoo>DDD</barfoo>
<foofoofoobar>EEE</foofoofoobar>
</properties>
我的 XSLT 只将元素更改为条目
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="properties/*">
<entry>
<xsl:attribute name="key" select="name()"/>
<xsl:apply-templates select="@* | node()"/>
</entry>
</xsl:template>
当我尝试使用另一个模板 <xsl:template match="properties[not(contains(name(), 'foo'))]"/> 时,它不会在 'entry' 元素模板之后执行。如果我在入口模板之前做一个模板,入口模板不执行。
期望的输出
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<entry key="foobar">CCC</entry>
<entry key="foofoofoobar">EEE</entry>
</properties>
非常感谢您的帮助。
编辑
我能够创建<xsl:template match="entry[not(contains(@*, 'foo'))]"/>,它将删除不包含 foo 的条目元素,这不完全是我想要的,但这是朝着正确方向迈出的又一步。但是,如果我将它们全部放在一个 XSLT 文档中,则只会运行第一个模板。
【问题讨论】: