Проблема преобразования XML с помощью XSLT - PullRequest
0 голосов
/ 31 мая 2011

У меня проблема с преобразованием xml в xml с использованием xsl. Я узнал, откуда возникла проблема, но все еще не знаю, как ее исправить.

<?xml version="1.0" encoding="UTF-8"?>
<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang">
  <impliesc>
    <catom name="name1"/>
    <catom name="name2"/>
  </impliesc>
  <impliesc>
    <catom name="name3"/>
    <catom name="name4"/>
  </impliesc>
</tells>   

Я думаю, что проблема исходит от этой строки

<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang">

Если я уберу "uri =" "xmlns =" ​​http://dl.kr.org/dig/2003/02/lang"" и оставлю только

"<tells>" 

все работает отлично. Но есть ли способ преобразовать его, не удаляя его?

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">

    <xsl:element name="tells">

        <xsl:for-each select="./tells/impliesc">

            <xsl:element name="impliesc">

                <xsl:for-each select="./tells/impliesc/catom">

                    <xsl:element name="catom">

                        <xsl:attribute name="name">
                            <xsl:value-of select="./tells/impliesc/individual/@name"/>
                        </xsl:attribute>

                     </xsl:element>

                </xsl:for-each>

            </xsl:element>

        </xsl:for-each>

    </xsl:element>

</xsl:template>

</xsl:stylesheet>

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Вы правы: причина, по которой ваше преобразование не работает, заключается в том, что у вас есть объявление пространства имен для элемента tells.

Чтобы устранить эту конкретную проблему, вам нужно, чтобы ваш XSLT знал о пространстве имен и сообщил ему, что элемент tells, который он пытается преобразовать, принадлежит этому пространству имен.Наиболее распространенный способ сделать это - объявить префикс пространства имен в элементе xsl:stylesheet, а затем использовать этот префикс в XPath, например:

<xsl:stylesheet xmlns:n="http://dl.kr.org/dig/2003/02/lang" ... >
   ...
   <xsl:template match="/">
      <output>
         <xsl:apply-templates select="//n:tells"/>
      </output>
   </xsl:template>

   <xsl:template match="n:tells">
      ...
   </xsl:template>

<xsl:stylesheet>

Атрибут xmlns:n в верхней частиТаблица стилей сообщает процессору XSLT, что пространство имен 'http://dl.kr.org/dig/2003/02/lang' существует, и что префикс n: является его сокращением.В атрибутах select и match префикс n: сообщает процессору XSLT, что при поиске элементов с именем tells он должен искать элементы с таким именем, которые находятся в пространстве имен http://dl.kr.org/dig/2003/02/lang.

Пространства имен XML являются неотъемлемой частью технологий XML, и люди часто упускают их из виду, когда изучают XML - они сложные и не очень интуитивно понятные, и вы можете игнорировать их довольно долго, когда будете подходитьускорить на XML.Но наступает момент, когда вы больше не можете себе позволить упрощенное предположение, что пространства имен не существуют, и вы на этом этапе.

0 голосов
/ 31 мая 2011

Ну, не увидев ваш XSLT-код, мы не сможем это исправить. Тем не менее, xmlns="http://dl.kr.org/dig/2003/02/lang" означает, что элементы tells и его дочерние элементы находятся в этом пространстве имен, поэтому ваш XSLT должен это учитывать. В XSLT 1.0 вашей таблице стилей необходимо привязать префикс к URI пространства имен и использовать этот префикс в выражениях XPath и шаблонах сопоставления XSLT для определения имен элементов, например

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:df="http://dl.kr.org/dig/2003/02/lang"
  exclude-result-prefixes="df"
  version="1.0">

  <-- examples -->
  <xsl:template match="df:tells">
    <foo>
     <xsl:apply-templates/>
    </foo>
  </xsl:template>

  <xsl:template match="df:impliesc">
    <bar>
      <xsl:apply-templates select="df:catom[1]"/>
    </bar>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 31 мая 2011

При работе с пространствами имен вы должны объявить их в своем преобразовании; в противном случае вы не сможете правильно выбрать узлы документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...