xslt测试是否存在属性

时间:2015-02-07 23:38:41

标签: xml xslt

我有以下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>

https://gist.github.com/guinslym/5ce47460a31fe4c4046b

2 个答案:

答案 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="*"/>以删除空格。