2014-12-28 189 views
1

我有一個XML文件,其中包含以下內容:匹配與XSI的元素:type屬性

<contents id="MLC1" name="Requirement1" uri="C:\abc.txt" xsi:type="requirement:Requirement" type=""> 
<contents id="GO1" name="Goal1" uri="C:\abc.txt" xsi:type="goal:Goal"> 

我想我的XML文件,它具有屬性xsi:type="requirement:Requirement"讓我內匹配的所有元素可以爲它添加一個名爲「label」的新屬性。這是我的樣式表:

<xsl:template match="//contents[@type='requirement:Requirement']"> 
    <contents> 
     <xsl:attribute name="label"> 
      <xsl:value-of select="@name"/> 
     </xsl:attribute>   
     <xsl:apply-templates select="node()|@*"/> 
    </contents> 
</xsl:template> 

我已經宣佈我的樣式表xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",但它似乎是無法匹配任何東西。我懷疑它是因爲在沒有xsi命名空間的原始xml中還有另一個屬性「type」。有沒有人有任何建議我應該用什麼來正確匹配這個元素?

回答

1

首先,請您輸入XML良好的文檔:

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <contents id="MLC1" name="Requirement1" uri="C:\abc.txt" 
      xsi:type="requirement:Requirement" type=""/> 
    <contents id="GO1" name="Goal1" uri="C:\abc.txt" xsi:type="goal:Goal"/> 
</root> 

然後,一定要使用xsi命名空間前綴上type

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="//contents[@xsi:type='requirement:Requirement']"> 
    <contents> 
     <xsl:attribute name="label"> 
     <xsl:value-of select="@name"/> 
     </xsl:attribute>   
     <xsl:apply-templates select="node()|@*"/> 
    </contents> 
    </xsl:template> 
</xsl:stylesheet> 

然後,您將得到以下輸出XML:

<?xml version="1.0" encoding="UTF-8"?> 
<contents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    label="Requirement1">MLC1Requirement1C:\abc.txtrequirement:Requirement</contents> 
+0

好吧,我實際上已經嘗試過使用在XSLT解析器中構建的應該使用Xalan的java 7。嘗試使用JLRishe的回答給我一個異常javax.xml.transform.TransformerConfigurationException:檢查表達式類型funcall(QName,[literal-expr(dk.dtu.imm.red.specificationelements.requirement),literal-expr(Requirement )])'..嘗試使用XSLT 1.0解決方案不符合任何結果。我將嘗試查明它是否適用於其他XSLT解析器(例如Saxon),並在此處再次發佈我的發現。 –

+0

我遵循從Saxon指南(S9APIExamples.java)給出的XSLT測試示例,並且它在XSLT 1.0解決方案中正常工作,所以我將使用該示例。謝謝您的幫助! –

1

通常情況下,你需要使用命名空間前綴來正確選擇屬性:

<xsl:template match="//contents[@xsi:type='requirement:Requirement']"> 

如果您使用的模式感知XSLT處理器,該xsi:type屬性可以有特殊的意義,將需要得到相應的對待。 See here for more info,但本質上,你需要做的:

<xsl:template match='//contents[@xsi:type = 
    QName("http://requirement/namespace/url/goes/here/", "Requirement")]'> 
+0

XSLT 2.0對xsi:type沒有特殊含義,XSD驗證的確如此。 –

相關問題