Предполагая, что вы точно знаете, что у вас всегда будет FirstName в первом элементе P и второе имя в элементе 2nd P, вы можете использовать общую функцию node-set (), чтобы получить конкретный элемент внутри вашего for-каждый цикл:
Следующий модифицированный XSLT генерирует желаемый вывод, который вы поместили в свой вопрос:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Memoria">
<cosa>
<xsl:for-each select="seccion">
<Address>
<xsl:for-each select="contenido">
<FirstName>
<xsl:value-of select="p" />
</FirstName>
<ul>
<LastName>
<xsl:value-of select="ul/li" />
</LastName>
</ul>
<FirstName>
<xsl:value-of select="exsl:node-set(.)/p[2]/."/>
</FirstName>
</xsl:for-each>
</Address>
</xsl:for-each>
</cosa>
</xsl:template>
</xsl:stylesheet>
Примечание: я обычно использую xmlns: msxsl = "urn: schemas-microsoft-com: xslt "для функции node-set (), но я думаю, что exsl не зависит от поставщика:)
Это может привести к поломке, если ваша структура XML непоследовательна или предсказуема;в противном случае это сработает, и вам не нужен еще один элемент for для каждого, чтобы получить 2-й элемент P для второго элемента результата FirstName.
Надеюсь, это полезно!