2015-07-07 8 views
0

Установка: Apache Xalan 2.7.1XSLT условными применяются-шаблоны

Вход:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
     <p> 
      <code>111</code> 
      <attr>good</attr> 
     </p> 
     <p> 
      <code>222</code> 
      <attr>bad</attr> 
     </p> 

     <s> 
      <ps> 
       <p> 
        <code>111</code> 
       </p> 
      <ps> 
     </s> 
     <s> 
      <ps> 
       <p> 
        <code>222</code> 
       </p> 
       <p> 
        <code>333</code> 
       </p> 
      <ps> 
     </s> 
</root> 

XSLT:

<?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:apply-templates select=" 
        root[./p/code = ./s/ps[1]/p/code and ./p/attr= 'bad']/s" /> 
    </xsl:template> 



<xsl:template match="s"> 
     <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

Желаемая Выбрать:

Я хотел бы выбрать только те s, который имеет в s/ps первый p с code, что указывает на p элемент с badattr

Примечание: Только XSLT 1.0 решения оценили

ответ

2

Рассмотрим использование ключа для поиска элементов p.

<xsl:key name="attr" match="root/p" use="code" /> 

Тогда ваш xsl:apply-templates упрощает для этого

<xsl:apply-templates select="root/s[key('attr', ps/p[1]/code)/attr = 'bad']" /> 

Попробуйте этот XSLT

<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:key name="attr" match="root/p" use="code" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="root/s[key('attr', ps/p[1]/code)/attr = 'bad']" /> 
    </xsl:template> 

    <xsl:template match="s"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

работает как шарм, спасибо :) –

Смежные вопросы