如何在不同的 XSL 模板中使用处理指令值?

How can I use processing instruction value in a different XSL template?

我无法在另一个模板中使用 processing-instruction 属性值,该模板已用于在输出文件的 header 中添加主题详细信息。

<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>

我无法在另一个已用于将主题信息提取到输出文件的 header 中的模板中使用它。

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

如何将 "processing-instruction('ASTDOCREVINFO')" 添加到此模板匹配中?

您不能将信息从一个模板匹配项传递到另一个模板匹配项,因为 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>