2015-04-13 6 views
1

Учитывая этот XML (упрощенный от реального содержания):XPATH Выберите детей родителя которого родственный соответствует условию

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://foo.com"> 
<name>Project Name</name> 
<namespace> 
    <name>ROOT</name> 
    <namespace> 
     <name>A</name> 
     <namespace> 
      <name>AA</name> 
      <subject> 
       <name>SUBJECT</name> 
      </subject> 
      <item> 
       <name>ITEM_AA1</name> 
      </item> 
     </namespace> 
    </namespace> 
    <namespace> 
     <name>B</name> 
     <namespace> 
      <name>BB</name> 
      <subject> 
       <name>SUBJECT</name> 
      </subject> 
      <item> 
       <name>ITEM_BB1</name> 
      </item> 
      <item> 
       <name>ITEM_BB2</name> 
      </item> 
     </namespace> 
    </namespace> 
</namespace> 
</project> 

Я пытаюсь создать таблицу стилей для преобразования текстовых узлов, таких как ITEM_BB1 и ITEM_BB2 - т.е. item/name/text() узлы, которые являются дочерними элементами namespace с дочерним элементом name, который имеет текстовое содержимое B.

У меня возникли проблемы с выяснением того, как создать шаблон, который правильно соответствует этим узлам.

Я попытался построить выражение с ../ и с осью следующего брата, но я не получаю его. Вот моя таблица стилей WIP:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:x="http://foo.com" 
    exclude-result-prefixes="x" 
    version="1.0" > 

    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy> 
    </xsl:template> 

    <!-- THIS OPERATES ON THE RIGHT ITEMS AT LEAST, BUT OUT OF CONTEXT --> 
    <!-- 
    <xsl:template match="x:namespace/x:name[text()='B']"> 
     <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy> 
     <xsl:for-each select="..//x:item/x:name/text()"> 
      <hello><xsl:value-of select="."/></hello> 
     </xsl:for-each> 
    </xsl:template> 
    --> 

    <!-- THIS IS INVALID --> 
    <xsl:template match="x:namespace/x:name[text()='B']/..//x:item/x:name/"> 
     <hello><xsl:value-of select="."/></hello> 
    </xsl:template> 

</xsl:stylesheet> 

Мой вопрос в том, как сделать шаблон подходящим для целевых узлов?

ответ

1

Попробуйте этот матч шаблон, чтобы избежать использования выражения .. в шаблоне

<xsl:template match="x:namespace[x:name/text()='B']//x:item/x:name"> 

Это может быть немного упрощена, чтобы это тоже ...

<xsl:template match="x:namespace[x:name='B']//x:item/x:name"> 
+0

Да, который работает для моего образца XML, Благодарю. Удручающе простое изменение того, что я пытался! – sudocode

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