Таблица стилей XSL не будет анализировать XML, сгенерированный DataContractSerializer - PullRequest
1 голос
/ 06 апреля 2009

У меня было несколько классов, которые я сериализовал с использованием 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">

Ответы [ 3 ]

3 голосов
/ 06 апреля 2009

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

Если 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>`

или

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

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

...
   <myTag><xsl:select value-of="//test"/></myTag>`
2 голосов
/ 06 апреля 2009

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

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

Марк

0 голосов
/ 06 апреля 2009

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

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

...