Как я могу использовать значение инструкции обработки в другом шаблоне XSL? - PullRequest
0 голосов
/ 20 июня 2019

Я не могу использовать значения атрибута инструкции обработки в другом шаблоне, который уже используется для добавления подробностей темы в заголовок выходного файла.

<task xml:lang="en-us" id="_01FDEB11">
    <?ASTDOCREVINFO __docVerName="1.6" __docVerDesc="Description goes here" __docVerUser="Leroy" __docVerDate="Sep 25, 2017 10:44:44 AM"?>

Я создал шаблон для извлечения значений из инструкции обработки, но переменные не сохраняют значения в другом шаблоне.

<xsl:template match="processing-instruction('ASTDOCREVINFO')">

Version: <xsl:value-of select="substring-before(substring-after(., '__docVerName=&quot;'), '&quot;')"/> 
Date: <xsl:value-of select="substring-before(substring-after(., '__docVerDate=&quot;'), '&quot;')"/>

<xsl:variable name="astVersion" select="substring-before(substring-after(., '__docVerName=&quot;'), '&quot;')"/>
<xsl:variable name="astDate" select="substring-before(substring-after(., '__docVerDate=&quot;'), '&quot;')"/>

Variable Version: <xsl:value-of select="$astVersion"/>
Variable Date: <xsl:value-of select="$astDate"/>

</xsl:template>

Я не могу заставить это работать в другом шаблоне, который уже использовался для извлечения информации о теме в заголовок выходного файла.

    <xsl:template
        match="*[contains(@class, ' topic/topic ')][not(parent::*[contains(@class, ' topic/topic ')])]/*[contains(@class, ' topic/title ')]">

Как я могу добавить "инструкцию обработки ('ASTDOCREVINFO')" к этому совпадению шаблона?

1 Ответ

0 голосов
/ 20 июня 2019

Вы не можете передавать информацию из одного совпадения шаблона в другое, поскольку XSLT не имеет побочных эффектов, но во втором шаблоне вы можете использовать XPath для сопоставления инструкции обработки, которая является дочерней по отношению к корневому элементу.Что-то вроде:

<xsl:template
    match="*[contains(@class, ' topic/topic ')][not(parent::*[contains(@class, ' topic/topic ')])]/*[contains(@class, ' topic/title ')]">
    <!-- /* => means the root element of the XML document -->
    <xsl:variable name="astoriaPI" select="/*/processing-instruction('ASTDOCREVINFO')"/>
    <xsl:variable name="astVersion" select="substring-before(substring-after($astoriaPI, '__docVerName=&quot;'), '&quot;')"/>
    <xsl:variable name="astDate" select="substring-before(substring-after($astoriaPI, '__docVerDate=&quot;'), '&quot;')"/>
</xsl:template>
...