Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Проблема при ипользовании XslCompiledTransform / 3 сообщений из 3, страница 1 из 1
19.04.2008, 09:38
    #35266057
XT84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема при ипользовании XslCompiledTransform
Вообщем есть вот такой XML:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<Object>
	<Number_Register>
		<CadastralNumber>xx:xx:xx xx xxx:xxxx</CadastralNumber>
		<Prev_CadastralNumber/>
		<Next_CadastralNumber/>
	</Number_Register>
	<Areas>
		<Area>
			<AreaCode> 070006000000 </AreaCode>
			<Area> 29 </Area>
			<Unit> 012002004000 </Unit>
		</Area>
	</Areas>
	<GroundCategory> 003002000000 </GroundCategory>
	<Address>
		<Address_text>Российская Федерация, Нью-Йоркская область, г. Нью-Йорк, ул. Им. Дж. Буша мл., д.  12 , кв.  5 </Address_text>
	</Address>
	<Rights>
		<Encumbrance>
			<Name>аренда</Name>
			<Type> 001002003000 </Type>
			<Registration>
				<RegNumber>xx-xx.xx-x.x.xxxx-xxx</RegNumber>
				<RegDate> 14 . 04 . 2000 </RegDate>
				<DateClose> 19 . 03 . 2008 </DateClose>
			</Registration>
		</Encumbrance>
		<Encumbrance>
			<Name>аренда</Name>
			<Type> 001002003000 </Type>
			<Registration>
				<RegNumber>xx-xx-xx/xxx/xxxx-xxx</RegNumber>
				<RegDate> 19 . 03 . 2008 </RegDate>
			</Registration>
			<Term>
				<Started> 25 . 12 . 2007 </Started>
				<Stopped> 24 . 12 . 2056 </Stopped>
			</Term>
		</Encumbrance>
	</Rights>
</Object>
и есть шаблон который приводит данный xml в читаемый человеком вид при этом коды (типа AreaCode) заменяются на соответствующие описания, для этого был написан вот такой именованный шаблон:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	<xsl:template name="GetCodeValue">
		<xsl:param name="CodeVal" />
		<xsl:param name="PathToDoc" />
		<xsl:variable name="Doc" select="document($PathToDoc)//xs:enumeration" />
		
		<xsl:for-each select="$Doc">
			<xsl:if test="@value=$CodeVal">
				<xsl:value-of select="xs:annotation/xs:documentation" />
			</xsl:if>
		</xsl:for-each>
	</xsl:template>
Проблемы начинаются при использовании функции document() XslCompiledTransform ругается на то что подключаемый файл лежит не в одном каталоге с XML файлом, т.е. считает относительный путь от XML, а не от от файла с шаблонами. При этом другие процессоры ведут себя более вменяемое и определяют относительные пути от XSLT шаблона (xsltproc все замечательно).
Вопрос как заставить XslCompiledTransform излечиться от этого "недуга", либо возможны какие-то обходные пути?
...
Рейтинг: 0 / 0
19.04.2008, 13:54
    #35266192
XT84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема при ипользовании XslCompiledTransform
Всем кто в субботу пытался думать над вопросом спасибо :) ! Проблему решил добавлением
Код: plaintext
<xsl:param name="BasePath" />
И уже из когда устанавливаю эту переменную
...
Рейтинг: 0 / 0
21.04.2008, 09:19
    #35267576
XT84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема при ипользовании XslCompiledTransform
Вдруг кому-нибудь тоже потребуется
Для решения своей проблемы я сделал так в файле xslt:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" version="1.0" encoding="windows-1251" indent="yes"/>
    <xsl:param name="BasePath"/>
    .......
    <xsl:template name="GetCodeValue">
        <xsl:param name="CodeVal"/>
        <xsl:param name="PathToDoc"/>
        <xsl:variable name="Doc" select="document(concat($BasePath, $PathToDoc))//xs:enumeration"/>

        <xsl:for-each select="$Doc">
            <xsl:if test="@value=$CodeVal">
                <xsl:value-of select="xs:annotation/xs:documentation"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
В коде (C#):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 // разрешение функции document()
 XsltSettings settings = new XsltSettings(true, true);
 XmlReaderSettings s = new XmlReaderSettings();

 // вот вот здесь устанавливается параметр BasePath
 XsltArgumentList arg = new XsltArgumentList();
 string[] pathToXslt = _PathToPackageStylesheet.Split(@"\".ToCharArray());
 arg.AddParam("BasePath", 
		     string.Empty,
		     string.Join(@"\\", pathToXslt,  0 , pathToXslt.Length -  1 ) + @"\\");

// собственно само преобразование документа
 XmlTextReader readerXslt = new XmlTextReader((Stream)File.OpenRead(_PathToPackageStylesheet));
 _XmlParcelStyleSheet.Load(readerXslt, settings, null);			
 _XmlParcelStyleSheet.Transform(XmlDoc, arg, StreamOut);
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Проблема при ипользовании XslCompiledTransform / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]