Как сопоставить элементу, чье пространство имен типа xsd: string - PullRequest
0 голосов
/ 29 февраля 2012

Как указать совпадение для элемента, атрибут type которого находится в пространстве имен xsd:?Например:

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

Я пытался

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

, но, похоже, это не работает.Спасибо.

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

В преобразовании XSLT 2.0 с учетом схемы, если атрибут типа объявлен в схеме с типом xs: QName, тогда вы хотите *[namespace-uri-from-QName(@type) = 'http://www.w3.org/2001/XMLSchema']

0 голосов
/ 29 февраля 2012

xsd: в этом значении атрибута не является объявлением пространства имен; это просто часть значения атрибута; вам просто нужно @type = 'xsd:string', чтобы соответствовать.

РЕДАКТИРОВАТЬ: Согласно комментариям, чтобы соответствовать чему-либо, начиная xsd:, вы можете просто использовать substring-before(@type,':') = 'xsd' или substring(@type,1,4) = 'xsd:'

0 голосов
/ 29 февраля 2012

В XPath имя без префикса всегда считается находящимся в «пространстве имен».

Таким образом, атрибут type не находится в пространстве имен.

Просто используйте :

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

Конечно, приведенный выше шаблон соответствия соответствует не только элементу identityID, но и любому элементу , строковому значению которого type атрибут 'xsd:string'.

ОБНОВЛЕНИЕ : ОП "допустил в комментарии", что ему фактически необходимо соответствовать любому элементу, атрибут которого type задает имя в схеме XMLnamespace.

Вот правильное решение (решение OP работает только для фиксированного префикса):

<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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...