Таблица стилей XSL не анализирует XML, созданный DataContractSerializer

У меня было несколько классов, которые я сериализовал с помощью XMLSerializer, а затем преобразовал с помощью XSLT в различные форматированные электронные письма или вызовы веб-сервисов. Все было хорошо.

Мы начали использовать Linq в некоторых частях уровня данных, и мне нужно было сериализовать некоторые объекты Linq, которые будут использоваться таблицами стилей XSL. Я решил, что, вероятно, лучше перейти к использованию DataContractSerializer вместо XMLSerializer.

У меня есть DataContracts и все настроено, и все хорошо сериализуется с парой незначительных изменений в именах сущностей ... НО теперь таблицы стилей вообще не будут обрабатывать XML. Я действительно понятия не имею, почему я не получаю хоть что-то ... в основном все, что выходит, это данные без тегов xsl.

Есть идеи, что могло бы вызвать это?

РЕДАКТИРОВАТЬ:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="CallTicket">

Вот XML, сгенерированный из DataContractSerializer до того, как я изменил объявление DataContract:

<CallTicket xmlns="http://schemas.datacontract.org/2004/07/CRMInterface.CRMData" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

person CodeRedick    schedule 06.04.2009    source источник


Ответы (3)


Скорее всего, у вас проблема с пространством имен. Например:

Если XML выглядит так

<Root xmls="http://www.example.org/1" ....

<test>one</test>

Тогда вам нужно будет сделать одно из двух в XSLT

Конкретно укажите пространство имен и используйте префикс соответственно

<xsl:stylesheet xmlns:ex="http://www.example.org/1" ....>`
   ...

    <myTag><xsl:select value-of="//ex:test"/></myTag>`

or

Если существует только одно пространство имен, сделайте его пространством имен по умолчанию для файла XSLT:

<xsl:stylesheet xmlns="http://www.example.com/1" ...`

...
   <myTag><xsl:select value-of="//test"/></myTag>`
person Mike Marshall    schedule 06.04.2009

Может быть, в вашем новом XML есть пространства имен XML, с которыми ваш XSLT не справляется должным образом?

Можете ли вы показать нам соответствующие части ваших файлов XML и XSLT?

Марк

person marc_s    schedule 06.04.2009
comment
Да, возможно. Как мне правильно работать с пространствами имен? Отредактирую в объявлениях xsl ... - person CodeRedick; 06.04.2009
comment
Если у вас есть пространства имен XML в вашем XML, вам понадобятся те же объявления в вашем XSLT, и вам нужно будет квалифицировать свои элементы с помощью префиксов xmlns: xy. - person marc_s; 06.04.2009
comment
Я не думаю, что вы можете контролировать, какое пространство имен используют объекты LINQ? Похоже, что он жестко закодирован в файле .designer.cs, и у дизайнера нет возможности получить к нему доступ ... - person CodeRedick; 06.04.2009
comment
Нет, вы не можете его изменить - пространство имен XML фиксировано - оно описывает XML для файлов LINQ dbml. Это всегда xmlns = schemas.microsoft.com/linqtosql/dbml/2007, что делает это просто - вы можете просто добавить это пространство имен в свой XSLT и все :-) - person marc_s; 07.04.2009

Думаю, я понял это, пространства имен важнее, чем я думал. Это работает, если я устанавливаю DataContractAttribute (Namespace = "") для каждого сериализуемого класса. Мне нужно еще поработать с объектами linq ... но на правильном пути.

Единственное, что меня пугает, это то, что в файле xslt не было ссылки на пространство имен ...

person CodeRedick    schedule 06.04.2009
comment
если ссылки нет, вам нужно добавить ее как атрибут в свой элемент xsl: stylesheet. См. Мой пример в заданном мной ответе - person Mike Marshall; 07.04.2009
comment
Не очищайте пространство имен, вместо этого установите для него что-то реальное, а затем используйте это пространство имен в своем XSL. Элементы XML идентифицируются комбинацией локального имени + пространства имен. Очищая пространство имен, вы повышаете вероятность конфликтов имен. - person John Saunders; 07.04.2009
comment
Установив его на что-то, я должен обновить десятки уже существующих таблиц стилей. : P Я сомневаюсь, что что-то из этого будет использовано вне моего собственного кода ... - person CodeRedick; 07.04.2009