2012-02-13 67 views
4

我奮力總結我的周圍XSLT頭......試圖轉換下面的XML:附加屬性的XML標籤

<employees> 
    <employee> 
     <employeeNumber>1234</employeeNumber> 
     <startdate>01/02/2003</startdate> 
     <activeFlag>true</activeFlag> 
     <firstname>Erik</firstname> 
     <address> 
      <addressline1>123 Main</addressline1> 
      <zip>07016</zip> 
      <state>New Jersey</state> 
      <city>My City</city> 
     </address> 
    </employee> 
</employees> 

到這個(即取activeFlag標記值並將其放入員工標籤的屬性中)。

<employees> 
    <employee active="true"> 
      <employeeNumber>1234</employeeNumber> 
      <startdate>01/02/2003</startdate> 
      <firstname>Erik</firstname> 
      <address> 
       <addressline1>123 Main</addressline1> 
       <zip>07016</zip> 
       <state>New Jersey</state> 
       <city>My City</city> 
      </address> 
    </employee> 
</employees> 

我已經試過以下XSLT,但它只是什麼都不做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="employees/employee">  
     <employee active="{activeFlag}"/> 
    </xsl:template> 

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

任何想法?

回答

3

這種短期和簡單(沒有明確的條件指令)轉換

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="employee"> 
    <employee active="{activeFlag}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </employee> 
</xsl:template> 

<xsl:template match="activeFlag"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<employees> 
    <employee> 
     <employeeNumber>1234</employeeNumber> 
     <startdate>01/02/2003</startdate> 
     <activeFlag>true</activeFlag> 
     <firstname>Erik</firstname> 
     <address> 
      <addressline1>123 Main</addressline1> 
      <zip>07016</zip> 
      <state>New Jersey</state> 
      <city>My City</city> 
     </address> 
    </employee> 
</employees> 

產生想要的正確結果

<employees> 
    <employee active="true"> 
    <employeeNumber>1234</employeeNumber> 
    <startdate>01/02/2003</startdate> 
    <firstname>Erik</firstname> 
    <address> 
     <addressline1>123 Main</addressline1> 
     <zip>07016</zip> 
     <state>New Jersey</state> 
     <city>My City</city> 
    </address> 
    </employee> 
</employees> 

說明:的identity rule重寫,使用AVT

如果要正確處理在沒有activeFlag孩子存在的情況下,它只是變得稍微複雜些

<xsl:template match="employee"> 
    <employee active= 
    "{concat(activeFlag, 
      substring('false', 
         1 div not(activeFlag)) 
      ) 
     }"> 
    <xsl:apply-templates select="node()|@*"/> 
    </employee> 
</xsl:template> 
+0

行 - 既感謝這麼多...多了一個跟進的問題(對不起不包括在OP中)。我試圖使用這種方法來將xmlns,xmlns:xsi和xsi:schemaLocation屬性添加到員工標籤 - 但是出錯了。這些特殊屬性還是什麼? – 2012-02-13 18:09:18

+0

@ErikSorensen:'xmlns ='不是屬性 - 這是一個名稱空間聲明。如果namespace-uri是靜態已知的,那麼創建一個名稱空間聲明沒有任何問題 - 如果不是在XSLT 1.0中,需要使用涉及xxx:node-set()擴展的技巧來創建一個動態命名空間。 – 2012-02-13 18:41:07

+0

@ErikSorensen:很高興我的回答對你有用。爲什麼不考慮接受它? – 2012-02-13 18:42:22

3

這XSLT 1.0樣式:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="employee"> 
    <xsl:copy> 
     <xsl:if test="activeFlag"> 
     <xsl:attribute name="active"><xsl:value-of select="activeFlag"/></xsl:attribute> 
     </xsl:if> 
     <xsl:apply-templates/>  
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="activeFlag"/> 

</xsl:stylesheet> 

應用到您的示例XML產生:

<employees> 
    <employee active="true"> 
     <employeeNumber>1234</employeeNumber> 
     <startdate>01/02/2003</startdate> 
     <firstname>Erik</firstname> 
     <address> 
     <addressline1>123 Main</addressline1> 
     <zip>07016</zip> 
     <state>New Jersey</state> 
     <city>My City</city> 
     </address> 
    </employee> 
</employees> 

可以刪除xsl:if如果你確信activeFlag會存在,或者,如果你不注意屬性是否被創建,無論它是否存在。

此外,您的樣式表不能正常工作的原因是您沒有在您的employees/employee匹配中應用模板。你可能也用這個模板:

<xsl:template match="employees/employee">  
    <employee active="{activeFlag}"> 
     <xsl:apply-templates/> 
    </employee> 
    </xsl:template>