2013-02-26 5 views
0

Как написать for-each цикл в XSLT 1.0, которые только рассмотреть Subbranch элементы с ID = 11 и 12, игнорируя 13 и 14. Заранее спасибоДля каждого контура в XSLT 1.0

<root> 
    <branch ID='1'> 
    <subbranch ID='11'> 
     <Values DataType='String'> 
     <Value StringLength='3'>abc</Value> 
     </Values> 
    </subbranch> 
    <subbranch ID='12'> 
     <Values DataType='String'> 
     <Value StringLength='3'>def</Value> 
     </Values> 
    </subbranch> 
    <subbranch ID='13'> 
     <Values DataType='String'> 
     <Value StringLength='3'>uvw</Value> 
     </Values> 
    </subbranch> 
    <subbranch ID='14'> 
     <Values DataType='String'> 
     <Value StringLength='3'>xyz</Value> 
     </Values> 
    </subbranch> 
    </branch> 
</root> 

ответ

1

Вы можете использовать xsl:for-each с выражение XPath, что соответствует только первые два подветви:

<xsl:template match="root"> 
    <xsl:for-each select="branch/subbranch[@ID='11' or @ID='12']"> 
     <!-- Emit something... --> 
    </xsl:for-each> 
</xsl:template> 

Или, альтернативно:

<xsl:template match="root"> 
    <xsl:for-each select="branch/subbranch[position() &lt; 3]"> 
     <!-- Emit something... --> 
    </xsl:for-each> 
</xsl:template> 
+0

Спасибо Hamidi за ваш ответ, но мне нужен общий вариант, где мы можем ограничить ChildNodes () по своей позиции. – user2109981

+0

@user, тогда второй шаблон в моем ответе должен быть уместным. –

+0

У меня есть некоторые вещи, которые я делаю внутри и i'v, чтобы ограничить дочерние узлы только из вышеуказанного шаблона, но указанное выше решение не будет работать внутри шаблона (match = "branch ") ... так что plz может предложить мне решение, где я могу получить положение дочерних узлов внутри user2109981

0

Рекомендуется избегать конструкций for-each, за исключением случаев, когда имеется дело с <xsl:key>. Вы должны использовать конструкцию match-template и apply-templates и просто не учитывать нежелательные значения.

Этот XSLT применяется к источнику:

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

<xsl:output indent="yes" method="xml"/> 

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

<xsl:template match="subbranch[@ID='13']"/> 
<xsl:template match="subbranch[@ID='14']"/> 

</xsl:stylesheet> 

дает этот вывод:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<branch ID="1"> 
    <subbranch ID="11"> 
     <Values DataType="String"> 
      <Value StringLength="3">abc</Value> 
     </Values> 
    </subbranch> 
    <subbranch ID="12"> 
     <Values DataType="String"> 
      <Value StringLength="3">def</Value> 
     </Values> 
    </subbranch> 
</branch> 
</root> 

Путем сопоставления нежелательные значения в пустых шаблонов, можно избежать этих частей XML, чтобы обрабатываться, например, <xsl:template match="subbranch[@ID='13']"/>

С наилучшими пожеланиями, Питер

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