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>

这里,&lt;title&gt; &lt;artist&gt;&lt;about&gt;&lt;pop&gt; &lt;retro&gt;&lt;classic&gt; 等主包装器的常见用法。

我的问题是如何将这些常用模板应用到我的主要包装器中 我能够进行所有转换,例如转换时间戳、删除连字符、更改标签名称。

【问题讨论】:

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>

仅此一项就可以逐级递归地复制所有内容,但是如果您为要转换的元素或节点添加自己的模板,您应该得到您想要的,即在您的情况下复制/保留例如mathBooksenglishBookscienceBook 并拥有您的模板,例如addressauthor 加入他们所做的小改动;编辑后,您似乎想要更改 catalog/a 元素以添加属性,因此请从上面显示的模板开始并添加例如

<xsl:template match="catalog/a">
  <a type="primary">
    <xsl:apply-templates/>
  </a>
</xsl:template>

使用这种方法,您可以为需要应用到不同节点或元素的任何进一步更改添加模板。

【讨论】:

感谢@Martin 的回复。我正在尝试后一种方法。所以我有自己的标签模板addressauthorbibliography。现在如何将这 3 个模板应用到我的主要包装器中,例如 mathBook englishBook 通过包含我发布的那个模板。 对不起,我想我搞砸了 samplexml。我再次编辑了我的问题。 @RIchaSharma,我仍然认为答案中的方法是您需要的,我添加了一个示例模板来实现您要执行的更改之一(向catalog/a 添加属性) ,只需为您想要对其他元素进行的其他更改添加更多模板。

以上是关于XSLT 如何将常用标签包装在不同的包装元素中?的主要内容,如果未能解决你的问题,请参考以下文章

在溢出之前包装不同长度的元素 X 次

如何指定一个元素,然后将其包装在 css flexbox 中? [复制]

如何在Angular中有条件地用不同的div包装元素

常用的包装盒款式

如何将 DOM 关键字包装在 span 标签中

Swift 3:如何将内容包装在具有多个标签的 tableviewcell 中?