Проблема совместимости с Saxon 9.2 он - PullRequest
0 голосов
/ 17 августа 2011

У меня проблема с файлом xslt в saxon 9.2 he. (Файл xslt работает в xslt 1.0 с движком, включенным в c #, но он слишком медленный)

Файл Xslt

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

  <xsl:template match="Magasins">
    <Magasins xmlns:xi="http://www.w3.org/2001/XInclude" Id="{@Id}">
      <xsl:apply-templates/>
    </Magasins>
  </xsl:template>

  <xsl:key name="kClientGroup" match="Client"
      use="concat(../@CodeRouteur, @ComplementCodeRouteur)"
        />

  <xsl:template match="Magasin">
<xsl:apply-templates select="Client[generate-id() 
        =
        generate-id(key('kClientGroup', 
        concat(../@CodeRouteur, @ComplementCodeRouteur))[1])]"
        />
  </xsl:template>

  <xsl:template match="Client">
    <Magasin
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}">

      <xsl:copy-of select="../@*[name() != 'CodeRouteur']"/>

      <xsl:apply-templates select="key('kClientGroup', 
                concat(../@CodeRouteur,@ComplementCodeRouteur))" mode="copy"/>

    </Magasin>
  </xsl:template>

  <xsl:template match="Client" mode="copy">
    <xsl:copy>
      <xsl:copy-of select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

исходный файл XML

<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
  <Magasin Nom="Name" CodeRouteur="TE">
    <Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
    <Client IdClient="2" ComplementCodeRouteur="B" Name="XXX"><Elem /></Client>
  </Magasin>
  <Magasin Nom="Name2" CodeRouteur="TE">
    <Client IdClient="3" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
  </Magasin>
</Magasins>

Требуемый выходной файл

<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
  <Magasin Nom="Name" CodeRouteur="TEA">
    <Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
  </Magasin>
  <Magasin Nom="Name" CodeRouteur="TEB">
    <Client IdClient="2" ComplementCodeRouteur="B" Name="XXX"><Elem /></Client>
  </Magasin>
  <Magasin Nom="Name2" CodeRouteur="TEA">
    <Client IdClient="3" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
  </Magasin>
</Magasins>

Но каждый раз, когда я использую атрибуты внутри Magasin или Client, такие как @ComplementCodeRouteur, он ничего не возвращает. Единственный работающий атрибут - это Id = {@ Id} в Magasins. Кто-нибудь знает почему и как это решить? Я не достаточно хорош, чтобы понять, почему это не работает.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Эта упрощенная таблица стилей:

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

  <xsl:template match="/">
    <Magasins>
      <xsl:apply-templates/>
    </Magasins>
  </xsl:template>

  <xsl:template match="Magasin">
    <xsl:apply-templates select="Client"/>
   </xsl:template>

  <xsl:template match="Client">
    <Magasin Nom="{../@Nom}"
         CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}">
      <xsl:apply-templates select="." mode="copy"/>
    </Magasin>
  </xsl:template>

  <xsl:template match="*" mode="copy">
    <xsl:copy>
      <xsl:copy-of select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

производит такой вывод:

$ java -jar c:/Java/saxon92/saxon9he.jar magasin.xml magasin2.xsl
Warning: at xsl:stylesheet on line 2 column 81 of magasin2.xsl:
  Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
  <Magasin Nom="Name" CodeRouteur="TEA">
      <Client IdClient="1" ComplementCodeRouteur="A" Name="YYY">
         <Elem/>
      </Client>
   </Magasin>
   <Magasin Nom="Name" CodeRouteur="TEB">
      <Client IdClient="2" ComplementCodeRouteur="B" Name="XXX">
         <Elem/>
      </Client>
   </Magasin>
  <Magasin Nom="Name2" CodeRouteur="TEA">
      <Client IdClient="3" ComplementCodeRouteur="A" Name="YYY">
         <Elem/>
      </Client>
   </Magasin>
</Magasins>

, что вы и хотели.

Предполагаемая проблема совместимости выглядит как побочная проблема.Ни один процессор XSLT не выдаст желаемый результат, используя таблицу стилей, показанную в вопросе.Поэтому я предлагаю другой способ получения результата.

1 голос
/ 17 августа 2011

Я попытался запустить ваши образцы с помощью Saxon 9.3.0.5 Java из командной строки, и вывод выглядит следующим образом:

Warning: at xsl:stylesheet on line 2 column 81 of test2011081702.xsl:
  Running an XSLT 1 stylesheet with an XSLT 2 processor
<?xml version="1.0" encoding="UTF-8"?>
<Magasins xmlns:xi="http://www.w3.org/2001/XInclude" Id="">
  <Magasin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            CodeRouteur="TEA"
            Nom="Name">
      <Client IdClient="1" ComplementCodeRouteur="A" Name="YYY">
         <Elem/>
      </Client>
      <Client IdClient="3" ComplementCodeRouteur="A" Name="YYY">
         <Elem/>
      </Client>
   </Magasin>
   <Magasin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            CodeRouteur="TEB"
            Nom="Name">
      <Client IdClient="2" ComplementCodeRouteur="B" Name="XXX">
         <Elem/>
      </Client>
   </Magasin>

</Magasins>

Это выглядит хорошо для меня (хотя в некоторых группах вы не показывалив вашем опубликованном образце).Действительно ли версия .NET, которую вы используете, дает вам другой результат?Как запустить преобразование с помощью .NET?

[править] Я также сейчас пробовал .NET-версию Saxon 9.3 из командной строки, она тоже выводит

Warning: at xsl:stylesheet on line 2 column 81 of test2011081702.xsl:
  Running an XSLT 1 stylesheet with an XSLT 2 processor
<?xml version="1.0" encoding="UTF-8"?>
<Magasins xmlns:xi="http://www.w3.org/2001/XInclude" Id="">
  <Magasin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            CodeRouteur="TEA"
            Nom="Name">
      <Client IdClient="1" ComplementCodeRouteur="A" Name="YYY">
         <Elem/>
      </Client>
      <Client IdClient="3" ComplementCodeRouteur="A" Name="YYY">
         <Elem/>
      </Client>
   </Magasin>
   <Magasin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            CodeRouteur="TEB"
            Nom="Name">
      <Client IdClient="2" ComplementCodeRouteur="B" Name="XXX">
         <Elem/>
      </Client>
   </Magasin>

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