Я ищу обходной путь для передачи параметров в соответствие с шаблоном. Я знаю, что это не разрешено в XPath, и поэтому я ищу решение «плана Б».
Это то, что я хотел бы работать:
Часть 1 xslt (2.0):
<xsl:template match="/">
<xsl:for-each select="//Main/PageList/Page">
<xsl:result-document href="{@ID}.xml">
<Page ID="{@ID}">
<xsl:apply-templates select="node()">
<xsl:with-param name="theID" select="@ID"/>
</xsl:apply-templates>
</Page>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
Так что довольно просто, не беспокойтесь об используемых тегах, по сути, он проходит через узел и для каждого узла создает один XML-файл. Каждый узел начинается с идентификатора, и именно этот идентификатор я хотел бы сделать доступным для других шаблонов. К сожалению, это отлично работает для именованных шаблонов, но не работает для совпадающих (по крайней мере, если я правильно понял теорию)
Итак, ниже то, что я хотел бы видеть работающим:
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:param name="theID"/>
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:with-param name="theID" select="$theID"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<!-- lots of templates here doing what I want them to do -->
<!-- one template creating an issue -->
<xsl:template match="@src">
<!-- would be nice to know the current ID, but unfortunately this one stays empty... -->
<xsl:param name="theID"/>
<!-- clean current attribute a bit -->
<xsl:variable name="S1" select="replace(.,'\.\.\/','')"/>
<xsl:attribute name="src">
<xsl:choose>
<xsl:when test="contains($S1,'common')">
<!-- just use current value, don't bother about current ID -->
<xsl:value-of select="$S1"/>
</xsl:when>
<xsl:otherwise>
<!-- use ID parameter -->
<xsl:value-of select="concat($theID,'_',$S1)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
Не смотрите на код как таковой, это просто меньшая часть всего файла, но суть в том, что я хочу использовать параметр ID из моей первой части (match="/") внутри другого шаблона (match= "@src"), но это кажется довольно сложным.
Я что-то упускаю ? Если мне просто не повезло, и это действительно невозможно, может ли кто-нибудь посоветовать, как мне действовать?
Заранее спасибо !
xsl:apply-templates select="//@src"
, где @src вместо node(). - person Emiliano Poggi   schedule 08.08.2011