我有以下xslt。我注意到有时元素名称' tuple'有一个属性。我想删除该属性并将其添加为元素。我添加了测试以验证是否' tuple'有一个属性,但它返回一个空白' ecatalogue'元件。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="atom">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="table">
<xsl:element name="{@name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!--this test doesn't work properly -->
<xsl:template match="tuple">
<xsl:choose>
<xsl:when test="@name">
<xsl:apply-templates />
</xsl:when>
<xsl:otherwise>
<!-- nothing to do
the node should stay the same
-->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- end test -->
</xsl:stylesheet>
我上面使用此模板的结果。
<ecatalogue>
</ecatalogue>
答案 0 :(得分:4)
我注意到有时元素名称&#39; tuple&#39;有一个属性。一世 想要删除该属性并将其添加为元素。我加了一个测试 验证是否&#39; tuple&#39;有一个属性
使用XSLT时,这绝对是不的最佳方法。您希望转换属性,而不是其父tuple
元素 - 因此您的模板应与直接属性匹配,例如:
<xsl:template match="tuple/@*">
<xsl:element name="{name()}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
此处不需要测试:如果属性存在,模板将匹配并处理它;如果没有,模板将根本不适用。
-
注意:上面假设您要将属性转换为tuple
的子元素,与另一个已存在的子元素同属。您的帖子在这一点上并不十分清楚。
答案 1 :(得分:2)
对模板匹配tuple
<xsl:template match="tuple">
<xsl:choose>
<xsl:when test="@name">
<tuple>
<xsl:element name="{@name}"/>
<xsl:apply-templates />
</tuple>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
复制了没有tuple
属性的所有name
个节点:
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:otherwise>
如果tuple
具有name
属性,tuple
的编写没有属性,属性作为元素添加(没有任何值,因为它不清楚如果它应该有任何值)并复制子节点:
<xsl:when test="@name">
<tuple>
<xsl:element name="{@name}"/>
<xsl:apply-templates />
</tuple>
</xsl:when>
输入XML的一部分作为示例:
<tuple name="ObjManufacturerRef">
<NamOrganisation>Unknown;:;Inconnu</NamOrganisation>
<NamOrganisationAcronym>Unknown</NamOrganisationAcronym>
<AddPhysCountry>Unknown</AddPhysCountry>
</tuple>
结果:
<tuple>
<ObjManufacturerRef/>
<NamOrganisation>Unknown;:;Inconnu</NamOrganisation>
<NamOrganisationAcronym>Unknown</NamOrganisationAcronym>
<AddPhysCountry>Unknown</AddPhysCountry>
</tuple>
已保存的示例:http://xsltransform.net/nc4NzQq/1添加了<xsl:strip-space elements="*"/>
以删除空格。