XSLT 如何将常用标签包装在不同的包装元素中?
Posted
技术标签:
【中文标题】XSLT 如何将常用标签包装在不同的包装元素中?【英文标题】:XSLT How to wrap common tags in different wrapping elements? 【发布时间】:2021-06-27 08:03:54 【问题描述】:我有一组通用的标签,需要用不同的包装元素包装。 示例输入 XML 就像-
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<a>Hello there</a>
<code>FJ-123-99</code>
<isPopular>True</isPopular>
<timestamp>2019-10-17 07:57:23</timestamp>
<pop>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<about>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</about>
</pop>
<classic>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<about>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</about>
</classic>
<retro>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<about>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</about>
</retro>
</catalog>
样本输出
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<a type="primary">Hello there</a>
<typeCode>FJ12399</typeCode>
<isPopular>Y</isPopular>
<timestamp>20191017:075723</timestamp>
<pop>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<about>
<organization>Columbia</organization>
<amount>10.90</amount>
<releaseTime>1985</releaseTime>
</about>
</pop>
<classic>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<about>
<organization>CBS Records</organization>
<amount>9.90</amount>
<releaseTime>1988</releaseTime>
</about>
</classic>
<retro>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<about>
<organization>USA</organization>
<amount>9.90</amount>
<releaseTime>1982</releaseTime>
</about>
</retro>
</catalog>
这里,<title>
<artist>
和 <about>
是 <pop>
<retro>
和 <classic>
等主包装器的常见用法。
我的问题是如何将这些常用模板应用到我的主要包装器中 我能够进行所有转换,例如转换时间戳、删除连字符、更改标签名称。
【问题讨论】:
XML 样本是输入样本还是想要的结果样本?如果没有最少但完整的 XML 输入示例、您拥有的 XSLT 和您想要的结果,以及您希望如何将输入映射到结果的文本描述,这很难提供帮助。 @MartinHonnen 这是示例输入 XML。我的问题是如何将常用模板(如 mailAddress、作者)应用于包装元素,如 mathsBook、englishBook、scienceBook?除了一些字体大小和样式翻译外,输出 XML 与输入 XML 相同。我需要输出中的所有标签与输入相同 【参考方案1】:从作为基本模板的身份转换开始,即
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
仅此一项就可以逐级递归地复制所有内容,但是如果您为要转换的元素或节点添加自己的模板,您应该得到您想要的,即在您的情况下复制/保留例如mathBooks
、englishBook
或 scienceBook
并拥有您的模板,例如address
或 author
加入他们所做的小改动;编辑后,您似乎想要更改 catalog/a
元素以添加属性,因此请从上面显示的模板开始并添加例如
<xsl:template match="catalog/a">
<a type="primary">
<xsl:apply-templates/>
</a>
</xsl:template>
使用这种方法,您可以为需要应用到不同节点或元素的任何进一步更改添加模板。
【讨论】:
感谢@Martin 的回复。我正在尝试后一种方法。所以我有自己的标签模板address
author
和bibliography
。现在如何将这 3 个模板应用到我的主要包装器中,例如 mathBook
englishBook
通过包含我发布的那个模板。
对不起,我想我搞砸了 samplexml。我再次编辑了我的问题。
@RIchaSharma,我仍然认为答案中的方法是您需要的,我添加了一个示例模板来实现您要执行的更改之一(向catalog/a
添加属性) ,只需为您想要对其他元素进行的其他更改添加更多模板。以上是关于XSLT 如何将常用标签包装在不同的包装元素中?的主要内容,如果未能解决你的问题,请参考以下文章