Member 13324229 Ответов: 1

Xsl с пространством имен XML


Как я выбираю на узле xml, когда xml имеет пространство имен.

Здесь простой xml без пространства имен.
<?xml version="1.0" encoding="utf-8"?>
<HouseList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Test</Name>
  <Id>42</Id>
  <HList>
    <House>
      <Name>Home</Name>
      <Id>88</Id>
      <RoomList>
        <Room>
          <Name>Kitchen</Name>
          <Id>21</Id>
        </Room>
      </RoomList>
    </House>
  </HList>
</HouseList>


мой xsl-это:
<pre lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <Root>
	<List>
		<HouseListName> 
			<Name>
				<xsl:value-of select="HouseList/Name"/>
			</Name>
			<Rooms>
				<xsl:for-each select="HouseList/HList">
					<Ho>				
						<Name>
							<xsl:value-of select="House/Name"/>
						</Name>
						<R>
							<xsl:for-each select="House/RoomList">
								<Room>				
									<Name>
										<xsl:value-of select="Room/Name"/>	
									</Name>
								</Room>	
							</xsl:for-each>
						</R>					
					</Ho>					
				</xsl:for-each>			
			</Rooms>
		</HouseListName>
	</List>
</Root>
</xsl:template>
</xsl:stylesheet> 


Транформация с помощью C#

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("xslTest.xsl");
xslt.Transform("Ser.xml", "Result.txt");


мой результат таков:

<?xml version="1.0" encoding="utf-8"?><Root><List><HouseListName><Name>Test</Name><Rooms><Ho><Name>Home</Name><R><Room><Name>Kitchen</Name></Room></R></Ho></Rooms></HouseListName></List></Root>


все хорошо и работает.
Теперь я сериализую datacontract своего класса, потому что теперь у меня есть словарь в одном из классов.

Мой XML-это сейчас:

<?xml version="1.0" encoding="utf-8"?><HouseList xmlns="http://schemas.datacontract.org/2004/07/Xsl_Transformer.Data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HList><House><Id>88</Id><Name>Home</Name><Note xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:KeyValueOfstringstring><a:Key>Sinn</a:Key><a:Value>42</a:Value></a:KeyValueOfstringstring><a:KeyValueOfstringstring><a:Key>Egal</a:Key><a:Value>88</a:Value></a:KeyValueOfstringstring></Note><RoomList><Room><Id>21</Id><Name>Kitchen</Name></Room></RoomList></House></HList><Id>42</Id><Name>Test</Name></HouseList>


Как я должен изменить свой xsl для правильного преобразования?
Как я получаю доступ к значению ключа if "Sinn"?

Что я уже пробовал:

прямое использование только xsl-узла xml:

<?xml version="1.0" encoding="utf-8"?><Root><List><HouseListName><Name></Name><Rooms /></HouseListName></List></Root>


У меня есть попробовать следующий сайт:
XSLT преобразование XML с пространствами имен-переполнение стека[^]

я пробую это
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"

xmlns:d="http://schemas.datacontract.org/2004/07/Xsl_Transformer.Data"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/d">
 <Root>
	<List>
		<HouseListName> 
			<Name>
				<xsl:value-of select="d:HouseList/Name"/>
			</Name>
			<Rooms>
				<xsl:for-each select="d:HouseList/HList">
					<Ho>				
						<Name>
							<xsl:value-of select="d:House/Name"/>
						</Name>
						<R>
							<xsl:for-each select="d:House/RoomList">
								<Room>				
									<Name>
										<xsl:value-of select="d:Room/Name"/>	
									</Name>
								</Room>	
							</xsl:for-each>
						</R>					
					</Ho>					
				</xsl:for-each>			
			</Rooms>
		</HouseListName>
	</List>
</Root>
</xsl:template>
</xsl:stylesheet> 

я понимаю это
<?xml version="1.0" encoding="utf-8"?>88HomeSinn42Egal8821Kitchen42Test


и без d на match - я имею в виду match= " / " с пространством имен d
я понимаю это
<?xml version="1.0" encoding="utf-8"?><Root xmlns:d="http://schemas.datacontract.org/2004/07/Xsl_Transformer.Data"><List><HouseListName><Name></Name><Rooms /></HouseListName></List></Root>


я читал это, но это даже не сработало
xslt-Как "выбрать" из XML с пространствами имен? - переполнение стека[^]

Что я могу сделать? Есть ли у кого-нибудь ссылка или помощь для меня?

Richard MacCutchan

Если вам нравится какой-то код на StackOverflow, который не работает, то вы должны разместить свой вопрос на этом сайте.

Atlapure Ambrish

Попробуйте такой онлайн-инструмент, как этот, Чтобы быстро настроить XSL и сразу увидеть результат. http://www.utilities-online.info/xsltransformation/#.WXWBh4SGPcs

1 Ответов

Рейтинг:
10

Member 13324229

У меня есть решение. Кончик У меня есть решение[^] был неплохой. Вы должны на каждом узле добавить префикс.

Как в этом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"

xmlns:d="http://schemas.datacontract.org/2004/07/Xsl_Transformer.Data"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="d">
 
<xsl:template match="/d:HouseList">
 <Root>
	<List>
		<HouseListName> 
			<Name>
				<xsl:value-of select="d:Name"/>
			</Name>
			<Rooms>
				<xsl:for-each select="d:HList">
					<Ho>				
						<Name>
							<xsl:value-of select="d:House/d:Name"/>
						</Name>
						<R>
							<xsl:for-each select="d:House/d:RoomList">
								<Room>				
									<Name>
										<xsl:value-of select="d:Room/d:Name"/>	
									</Name>
								</Room>	
							</xsl:for-each>
						</R>					
					</Ho>					
				</xsl:for-each>			
			</Rooms>
		</HouseListName>
	</List>
</Root>
</xsl:template>
</xsl:stylesheet> 


Результат таков:

<?xml version="1.0" encoding="UTF-8"?><Root><List><HouseListName><Name>Test</Name><Rooms><Ho><Name>Home</Name><R><Room><Name>Kitchen</Name></Room></R></Ho></Rooms></HouseListName></List></Root>


Решено! =)

исключить-результат-префиксы удалить пространство имен из xsl в новом XML-файле

Как сделать так, чтобы этот вопрос был решен?