xslt在元素不存在的情况下添加默认值

时间:2011-07-11 10:32:37

标签: xslt

我正在努力尝试测试是否存在元素。如果没有,我想添加一个默认值。这是我的XML

<records>
  <record>
    <InstanceData>
      <instance>
        <FirstName>Johhny</FirstName>
        <LastName>Jenkins</LastName>
        <AlbumCount>3</AlbumCount>
      </instance>
    </InstanceData>
  </record>
  <record>
    <InstanceData>
      <instance>
        <FirstName>Art</FirstName>
        <LastName>Tatum</LastName>
        <AlbumCount>7</AlbumCount>
      </instance>
    </InstanceData>
  </record>
  <record>
    <InstanceData>
      <instance>
        <FirstName>Count</FirstName>
        <LastName>Basie</LastName>
      </instance>
    </InstanceData>
  </record>
</records>

我希望能够复制现有值并将没有Album Count元素的任何记录设置为<AlbumCount>0</AlbumCount>。这是我一直在使用的xslt,但我认为我有点偏僻。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0"> 
  <xsl:template match="Records">
    <xsl:for-each select="node()">
      <xsl:choose>
        <xsl:when test="name()='AlbumCount'">
          <xsl:element name="AlbumCount">
            <xsl:choose>
              <xsl:when test="name()='AlbumCount'">
                <xsl:copy-of select=".">
                </xsl:copy-of>
              </xsl:when>
              <xsl:otherwise>
                <AlbumCount>0</AlbumCount>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select=".">
          </xsl:copy-of>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

感谢您的光临。

2 个答案:

答案 0 :(得分:8)

试试这个:

<?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" omit-xml-declaration="no"/>

<!-- identity template -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="instance[not(AlbumCount)]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <AlbumCount>0</AlbumCount>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>   

从身份转换开始,然后以不同方式处理异常。

答案 1 :(得分:3)

您只需使用元素名称测试元素的存在,例如:

<xsl:if test="not(AlbumCount)">
  <AlbumCount>0</AlbumCount>
</xsl:if>

执行所需操作的更简单方法是将标准副本模板与特殊规则结合使用,以适用于需要添加AlbumCount元素的位置:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <!-- Standard copy template -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Special template to add AlbumCount elements where required -->
  <xsl:template match="records/record/InstanceData/instance">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <xsl:if test="not(AlbumCount)">
        <AlbumCount>0</AlbumCount>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>