Проблема с получением XSLT значений из тегов с префиксами пространства имен - PullRequest
1 голос
/ 26 июля 2010

У меня есть определенная проблема с получением значений для ширины и высоты из некоторого XML, для которого определены префиксы пространства имен.Я могу легко получить другие значения, такие как SomeText из RelatedMaterial, используя обычный xpath с пространством имен «n:», но не могу получить значения ширины и высоты.

Пример XML:

<Description>
<Information>
<GroupInformation xml:lang="en">
 <BasicDescription>
  <RelatedMaterial>
   <SomeText>Hello</SomeText>
   <t:ContentProperties>
    <t:ContentAttributes>
     <t:Width>555</t:Width>
     <t:Height>444</t:Height>
    </t:ContentAttributes>
   </t:ContentProperties>
  </RelatedMaterial>
 </BasicDescription>
</GroupInformation>
</Information>
</Description>

Здесьявляется выдержкой из XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:n="urn:t:myfoo:2010" xmlns:tva2="urn:t:myfoo:extended:2008"

<xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>

<xsl:template match="n:GroupInformation">
  <width>
    <xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
  </width>
</xsl:template>

Вышеприведенный XSLT не работает для получения ширины.Есть идеи?

1 Ответ

2 голосов
/ 26 июля 2010

Я не уверен, что вы поняли, что и ваш ввод, и XSLT неверны, всегда лучше предоставить рабочие примеры.

В любом случае, если мы посмотрим на выражение XPath n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width, которое вы используетепрефикс n, который сопоставляется с urn:t:myfoo:2010, но когда данные находятся в пространстве имен по умолчанию.То же самое касается префикса t, который вообще не определен ни во входных данных, ни в XSLT.

Вам необходимо определить пространства имен на "обеих сторонах" в данных XML и преобразовании XSLTи они должны быть одинаковыми, не префиксы, а URI.

Возможно, кто-то другой мог бы объяснить это лучше меня.

Я исправил ваш пример и добавил несколько вещей ксделать эту работу.

Ввод:

<?xml version="1.0" encoding="UTF-8"?>
<Description 
  xmlns="urn:t:myfoo:2010" 
  xmlns:t="something...">
  <Information>
    <GroupInformation xml:lang="en">
      <BasicDescription>
        <RelatedMaterial>
          <SomeText>Hello</SomeText>
          <t:ContentProperties>
            <t:ContentAttributes>
              <t:Width>555</t:Width>
              <t:Height>444</t:Height>
            </t:ContentAttributes>
          </t:ContentProperties>
        </RelatedMaterial>
      </BasicDescription>
    </GroupInformation>
  </Information>
</Description>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
  xmlns:n="urn:t:myfoo:2010" 
  xmlns:t="something...">

  <xsl:template match="/">
    <xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>
  </xsl:template>

  <xsl:template match="n:GroupInformation">
    <xsl:element name="width">
      <xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<width>555</width>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...