2011-07-11 69 views
4

我努力嘗試去測試一個元素是否存在。如果沒有,我想添加一個默認值。這裏是我的XMLxslt添加默認值,其中元素不存在

<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> 

我希望能夠複製在現有的值,並設置任何記錄沒有相冊數元素<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> 

感謝您的期待。

+1

你目前得到什麼輸出? –

回答

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> 

從身份轉換開始,然後以不同方式處理異常。

+2

+1。絕對比接受的答案好。 –

+0

@Dimitre - 爲大起來! –

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> 
+0

@Kragen我鞠躬致敬Dimitre的請求,但仍然非常感謝您提出一個工作解決方案! – Willb