XSL Transform, выберите в префиксе пространство имен? - PullRequest
2 голосов
/ 13 октября 2009

Я пытаюсь выбрать узел из следующего xml, который имеет префикс из пространства имен:

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01">
<Cube>
    <Cube time="2009-10-12">
        <Cube currency="USD" rate="1.4765"/>
        .............................

xsl, который я использую (обновлен): Оригинальный XML находится по адресу: http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/"> 
    <xdoc>
        <ccurency>
        <xsl:for-each select="gesmes:Envelope/Cube/Cube">
<xsl:variable name="atime" select="@time"/>  
        <xsl:for-each select="Cube">
                <row>
                <xsl:element name="Date">
                <xsl:value-of select="$atime"/>
                </xsl:element>    
                        <xsl:element name="Currency">
                <xsl:value-of select="@currency"/>
                </xsl:element>
                <xsl:element name="Rate">
                <xsl:value-of select="@rate"/>
                </xsl:element>
        </row>
        </xsl:for-each>
    </xsl:for-each>
    </ccurency>         
</xdoc>                 
</xsl:template>
</xsl:stylesheet>

Это не работает, выбор пуст. Если я изменю gesmes: Envelope на простой Envelope в xml и xsl, все работает нормально?

Как мне выбрать его с префиксом?

Ответы [ 2 ]

3 голосов
/ 13 октября 2009

Убедитесь, что вы объявили пространство имен в корневом элементе преобразования:

<xsl:stylesheet xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

Глядя на вашу логику и входной XML, похоже, что внутренний for-each никогда не выберет узлы, поскольку контекст изменяется на внутренний элемент <cube>, пространство имен или нет. Это может быть просто результатом сокращения вашего XML для вопроса, хотя ...

2 голосов
/ 14 октября 2009

Похоже, вы ищете что-то вроде этого:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
  xmlns:exr="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
  exclude-result-prefixes="gesmes exr"
>
  <xsl:output method="xml" indent="yes" encoding="utf-8" />

  <xsl:template match="gesmes:Envelope">
    <xdoc>
      <ccurency>
        <xsl:apply-templates select="exr:Cube/exr:Cube/exr:Cube" />
      </ccurency>
    </xdoc>
  </xsl:template>

  <xsl:template match="exr:Cube[@currency and @rate]">
    <row>
      <Date>
        <xsl:value-of select="../@time" />
      </Date>
      <Currency>
        <xsl:value-of select="@currency" />
      </Currency>
      <Rate>
        <xsl:value-of select="@rate" />
      </Rate>
    </row>
  </xsl:template>

</xsl:stylesheet>

При применении к вашему входному XML он выдает:

<xdoc>
  <ccurency>
    <row>
      <Date>2009-07-16</Date>
      <Currency>PHP</Currency>
      <Rate>67.739</Rate>
    </row>
    <row>
      <Date>2009-07-16</Date>
      <Currency>SGD</Currency>
      <Rate>2.0501</Rate>
    </row>
    <row>
      <Date>2009-07-16</Date>
      <Currency>THB</Currency>
      <Rate>48.13</Rate>
    </row>
    <row>
      <Date>2009-07-16</Date>
      <Currency>ZAR</Currency>
      <Rate>11.4575</Rate>
    </row>
  </ccurency>
</xdoc>

Примечания:

  • Не используйте <xsl:for-each>, когда это возможно. Это выглядит более знакомым и менее пугающим, чем <xsl:apply-templates>, но в большинстве случаев это не лучший вариант.
  • Вам не нужно создавать элементы с <xsl:element>, вы можете написать их напрямую.
  • Вам не нужно хранить переменную с тем значением @time, которое вас интересует. Вы всегда можете обратиться к родительскому узлу и извлечь его оттуда напрямую (../@time)
  • Я использовал exclude-result-prefixes, чтобы пространства имен полностью исчезли из вывода, вы, кажется, хотите избавиться от них
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...