我正在尝试重命名以下父/子注释,这些注释位于 XML 文档中的几级
<product-lineitem>
<price-adjustments>
<price-adjustment>
...
</price-adjustment>
<price-adjustment>
...
</price-adjustment>
</price-adjustments>
</product-lineitem>
到
<product-lineitem>
<line-price-adjustments>
<line-price-adjustment>
...
</line-price-adjustment>
<line-price-adjustment>
...
</line-price-adjustment>
</line-price-adjustments>
</product-lineitem>
我已经弄清楚如何使用 XSLT 执行此操作,但我认为我正在复制我的逻辑并且可能滥用 xslt,是否可以在少于以下两个模板的情况下进行上述转换
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="product-lineitem/price-adjustments">
<line-price-adjustments><xsl:apply-templates select="@*|node()" /></line-price-adjustments>
</xsl:template>
<xsl:template match="product-lineitem/price-adjustments/price-adjustment">
<line-price-adjustment><xsl:apply-templates select="@*|node()" /> </line-price-adjustment>
</xsl:template>
</xsl:transform>
我想我正在创建 xml 转换代码气味,因为我仍在学习!
不,您没有创建代码异味。您正在使用的模式(包括标识模板(以及要更改的元素的覆盖模板通常是要走的路。
您可以进行的一种简化是,您实际上不需要指定要匹配的元素的完整路径。只需元素名称即可
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="price-adjustments">
<line-price-adjustments>
<xsl:apply-templates select="@*|node()" />
</line-price-adjustments>
</xsl:template>
<xsl:template match="price-adjustment">
<line-price-adjustment>
<xsl:apply-templates select="@*|node()" />
</line-price-adjustment>
</xsl:template>
</xsl:transform>
仅当您在不同的元素名称下有一个price-adjustment
时,您才需要指定更完整的路径,例如,您不想更改。
如果您确定要匹配的元素永远不会具有属性,也可以仅将<xsl:apply-templates select="@*|node()" />
替换为<xsl:apply-templates />
。
如果您只是想收紧代码,也可以使用以下模板。
<xsl:template match="price-adjustment | price-adjustments">
<xsl:element name="line-{name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
。或:
<xsl:template match="*[starts-with(name(), 'price-adjustment')]">
<xsl:element name="line-{name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
在示例输入 XML 的特定情况下,像这样缩短代码并没有多大作用。 但是,如果您有很多元素想要通过简单地在前面置或附加另一个字符串来以类似的方式重命名,这可以使您不必编写无数个模板,这些模板都执行基本相同的操作。