отсеивание лишних узлов

jian

Guest
v drugom meste nekotorye rebyata sporili (toje? do i argue?).
v konce koncov prishli k perlovskomu:
"There Is More Than One Way To Do It"

hehe ;)
 

Alexandre

PHPПенсионер
с ключами не получилось:
PHP:
<DESC lang="RUS">

<FILTER> 
  <ITEM id="25606" /> 
  <ITEM id="25613" /> 
  <ITEM id="25617" /> 
</FILTER>

<CONTENTS>
<CONTENT type_id="1" type_name="logotypes" extention="GIF" >
<FOLDERS>
<FOLDER name="Новинки" tag="0">
<ITEMS>
  <ITEM id="25606" code="26371" keywords=",,,Новинки" /> 
  <ITEM id="25607" code="26373" keywords=",,,Новинки" /> 
  <ITEM id="25608" code="26375" keywords=",,,Новинки" /> 
  <ITEM id="25609" code="26377" keywords=",,,Новинки" /> 
  <ITEM id="25610" code="26379" keywords=",,,Новинки" /> 
  <ITEM id="25611" code="26381" keywords=",,,Новинки" /> 
  <ITEM id="25612" code="26383" keywords=",,,Новинки" /> 
  <ITEM id="25613" code="26385" keywords=",,,Новинки" /> 
  <ITEM id="25614" code="26387" keywords=",,,Новинки" /> 
  <ITEM id="25615" code="26389" keywords=",,,Новинки" /> 
  <ITEM id="25616" code="26391" keywords=",,,Новинки" /> 
  <ITEM id="25617" code="26393" keywords=",,,Новинки" /> 
  <ITEM id="25618" code="26395" keywords=",,,Новинки" /> 
  <ITEM id="25619" code="26397" keywords=",,,Новинки" /> 
</ITEMS>
</FOLDER>
</FOLDERS >
</CONTENT>
</CONTENTS>
</DESC >
Преобразование:
PHP:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
 <xsl:key match="/DESC/FILTER/ITEM" name="id" use="@id" />

<xsl:template match="/">
<DESC lang="RUS">
	<xsl:apply-templates select="/DESC" />
</DESC>
</xsl:template>

<xsl:template match="CONTENTS">

  
	<xsl:if test="not( current()/@id ) or current()[@id !=  key('id',curent()/@id )  ] ">
		<xsl:copy-of select="." />
	</xsl:if>
</xsl:template>     
</xsl:stylesheet>
Результат вых док = входному - теги <FILTER>
Где ошибка?
Почему узлы не отсеиваются
 

jian

Guest
xml:
Код:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="filter.xsl"?>
<desc lang="rus"> 
  <filter> 
    <item id="25606" /> 
    <item id="25613" /> 
    <item id="25617" /> 
  </filter> 
  <contents> 
    <content type_id="1" type_name="logotypes" extention="gif" > 
      <folders> 
        <folder name="new toys" tag="0"> 
          <items> 
            <item id="25606" code="26371" keywords=",,,new toys" /> 
            <item id="25607" code="26373" keywords=",,,new toys" /> 
            <item id="25608" code="26375" keywords=",,,new toys" /> 
            <item id="25609" code="26377" keywords=",,,new toys" /> 
            <item id="25610" code="26379" keywords=",,,new toys" /> 
            <item id="25611" code="26381" keywords=",,,new toys" /> 
            <item id="25612" code="26383" keywords=",,,new toys" /> 
            <item id="25613" code="26385" keywords=",,,new toys" /> 
            <item id="25614" code="26387" keywords=",,,new toys" /> 
            <item id="25615" code="26389" keywords=",,,new toys" /> 
            <item id="25616" code="26391" keywords=",,,new toys" /> 
            <item id="25617" code="26393" keywords=",,,new toys" /> 
            <item id="25618" code="26395" keywords=",,,new toys" /> 
            <item id="25619" code="26397" keywords=",,,new toys" /> 
          </items> 
        </folder> 
      </folders > 
    </content> 
  </contents> 
</desc >
xsl:
Код:
<?xml version="1.0"?>
<xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0"> 
<xsl:strip-space elements="*" /> 
<xsl:output indent="yes" method="xml" /> 

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

<xsl:template match="filter"/> 

<xsl:template match="*"> 
  <xsl:if test="not(name() = 'item' and /desc/filter/item/@id[.=current()/@id])">
    <xsl:element name="{name()}">
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates /> 
    </xsl:element>
  </xsl:if>
</xsl:template> 

<xsl:template match="@*"> 
  <xsl:attribute name="{name()}">
    <xsl:value-of select="." /> 
  </xsl:attribute>
</xsl:template> 

</xsl:stylesheet>
resultat:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<desc lang="rus">
  <contents>
    <content type_id="1" type_name="logotypes" extention="gif">
      <folders>
        <folder name="new toys" tag="0">
          <items>
            <item id="25607" code="26373" keywords=",,,new toys"/>
            <item id="25608" code="26375" keywords=",,,new toys"/>
            <item id="25609" code="26377" keywords=",,,new toys"/>
            <item id="25610" code="26379" keywords=",,,new toys"/>
            <item id="25611" code="26381" keywords=",,,new toys"/>
            <item id="25612" code="26383" keywords=",,,new toys"/>
            <item id="25614" code="26387" keywords=",,,new toys"/>
            <item id="25615" code="26389" keywords=",,,new toys"/>
            <item id="25616" code="26391" keywords=",,,new toys"/>
            <item id="25618" code="26395" keywords=",,,new toys"/>
            <item id="25619" code="26397" keywords=",,,new toys"/>
          </items>
        </folder>
      </folders>
    </content>
  </contents>
</desc>
 

Alexandre

PHPПенсионер
jian Спасибо, вариант рабочий, сейчас попробую на большом массиве.

chameleon а возможен вариант с ключами? тоже интерестно?
 

chameleon

Новичок
а возможен вариант с ключами?
Все-таки вариант с ключами оптимален, если есть только признак(правило) по которому нужно отсеивать элементы и производится множественный поиск по различным значениям ключа. В твоем случае (отсеиваемые элементы перечислены явно), имхо, лучше и проще использовать решение от jian.
 
Сверху