2012-02-29 70 views
0

如何爲類型屬性位於xsd:namespace中的元素指定匹配項?例如:如何匹配其類型名稱空間爲xsd的元素:字符串

<enitityID maxOccurs="0" minOccurs="0" type="xsd:string"/> 

我試圖

<xsl:template match="*[namespace-uri(@type)= 'http://www.w3.org/2001/XMLSchema']"> 
... 
</xsl:template> 

,但它似乎並沒有工作。謝謝。

回答

0

該屬性值中的xsd:不是一個名稱空間聲明;它只是屬性值的一部分;你只需要@type = 'xsd:string'來匹配它。

編輯:根據意見,以匹配任何開始xsd:,你可以只使用substring-before(@type,':') = 'xsd'substring(@type,1,4) = 'xsd:'

+0

我需要搭配其他XSD類型之外的xsd:字符串 – bretter 2012-02-29 15:23:51

+1

答案是 的 您的評論讓我看着辦吧出。 – bretter 2012-02-29 15:29:42

+0

嘿,我正要編輯:) – Flynn1179 2012-02-29 16:03:28

0

在XPath中,前綴不確定的屬性名稱始終被認爲是在「no namespace」中。

因此,type屬性沒有名稱空間。

只需使用

<xsl:template match="*[@type = 'xsd:string']"> 
... 
</xsl:template> 

當然,上述匹配模式不僅identityID元件,但匹配任何元素的字符串值,其type屬性是'xsd:string'

UPDATE:該OP已「承認了註釋」,他居然需要其type屬性指定在XML Schema命名空間的名稱的任何元素匹配。

這是一個正確的解決方案(業務方案的解決方案僅適用於一個固定的前綴):

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match= 
    "*[namespace::* 
     [name() = substring-before(../@type, ':') 
     and 
     . = 'http://www.w3.org/2001/XMLSchema' 
     ] 
    ]"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

這種轉變相匹配的任何元素,其type屬性的值是在XML架構命名空間的名稱 - 不管使用的前綴是

當應用於,例如,在下面的XML文檔

<t xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<enitityID maxOccurs="0" minOccurs="0" type="xsd:string"/> 
<somethingElse/> 
<intIdID maxOccurs="0" minOccurs="0" type="xs:integer"/> 
</t> 

正確的結果(所有這些匹配元素複製到輸出)產生

<enitityID xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      maxOccurs="0" minOccurs="0" type="xsd:string"/> 


<intIdID xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     maxOccurs="0" minOccurs="0" type="xs:integer"/> 
+0

我需要匹配除xsd之外的其他xsd類型:字符串 – bretter 2012-02-29 15:23:38

+0

@bretter:學會說出你在問題中需要什麼! – 2012-02-29 15:32:25

+0

@bretter:並看到我的更新爲您的真正問題的正確解決方案。 – 2012-02-29 15:51:04

1

在感知模式的XSLT 2.0轉換,如果類型屬性類型爲XS架構聲明:QName的,那麼你想*[namespace-uri-from-QName(@type) = 'http://www.w3.org/2001/XMLSchema']

相關問題