Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Подскажите выражение для связывания


Автор: Mr_Smith 3.8.2007, 07:11
Здравствуйте. 
у меня такая проблема
есть исходный иксмл:

Код

<?xml version="1.0"?>
<root>
<Ref27>
 <ID>8778</ID>
 <Pole>89789</Pole>
 <IDKontragent>555</IDKontragent>
</Ref27>
<Ref27>
 <ID>8998</ID>
 <Pole>89799</Pole>
 <IDKontragent>555</IDKontragent>
</Ref27>

<Ref32>
 <ID>555</ID>
 <Pole>89799</Pole>
</Ref32>
<Ref32>
 <ID>777</ID>
 <Pole>89799</Pole>
</Ref32>
</root>


и конечный, в котором в элемент Ref32 нужно добавить элементы <doc></doc> значением которых будет id элементов из Ref27, IDKontragent  которых = ID Ref32

Просто говоря:   для каждого ID из ref32 надо надо проверить все IDKontragent и если есть совпадения  тогда записать ID из ref27 в Ref32 где и произошло совпадение.

Для данного примера Ref32 должен получиться таким:
Код

<Ref32>
 <ID>555</ID>
 <Pole>89799</Pole>
  <doc>8778</doc>
 <doc>8998</doc>
</Ref32>

<Ref32>
 <ID>777</ID>
 <Pole>89799</Pole>
</Ref32>
  

Подскажите Xpath выражение, которое можно применить в XSLT шаблоне чтоб сделать это? 

Ппробовал так но не могу понять систему наследований в данном случае:
Код

  <xsl:template match="Ref32">
    <ref32>
      <xsl:copy-of select="child::*"/>
      <xsl:for-each select="//Ref27">
        <xsl:if test="./IDKontragent=child::ID">
          <doc>
            <xsl:value-of select="." />
          </doc>
        </xsl:if>
      </xsl:for-each>
    </ref32>
  </xsl:template>

Автор: batigoal 3.8.2007, 09:29
Вроде так работает:

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="/root/Ref32"/>
        </root>
    </xsl:template>
    
    <xsl:template match="/root/Ref32">
        <Ref32>
            <xsl:copy-of select="child::*"/>
            <xsl:apply-templates select="/root/Ref27">
                <xsl:with-param name="id_ref32">
                    <xsl:value-of select="./ID"/>
                </xsl:with-param>
            </xsl:apply-templates>
        </Ref32>
    </xsl:template>
    
    <xsl:template match="/root/Ref27">
        <xsl:param name="id_ref32"/>
        <xsl:if test="./IDKontragent=$id_ref32">
            <doc>
                <xsl:value-of select="./ID"/>
            </doc>
        </xsl:if>
    </xsl:template>
    
</xsl:stylesheet>


Идея в том, что внутри обработки Ref32 я вызываю шаблон для Ref27, передавая ему ID в качестве параметра.

Автор: Mr_Smith 3.8.2007, 13:14
Спасибо, batigoal. Человек-мышь.))))
Пока еще не пробовал, но чувствую что все заработает как надо. 

Автор: batigoal 3.8.2007, 13:44
Заработать - заработает, сомнения только в том, что "как надо" smile

Автор: Mr_Smith 6.8.2007, 05:20
Немного подредактировал - и все заработало как швейцарские часы.
Еще раз спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)