我有一个XSLT 1.0渲染的XML文件。
我的cas是:
如果
longName
的值为“ Oui_Combi”
$Publication
=prodDate
值( 2018年11月21日)其他
$Publication
=productionDates
值( 2018年11月17日,2018年11月21日)
我不知道我的语法在for-each和/或xsl-if上是正确的
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<Manuscript dateAndTime="2018-11-16T10:20:59.177+01:00" renderEPS="" forMediation="false">
<Order>
<OrderHeader productionDates="17.11.2018, 21.11.2018">
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<Criterion name="TypePublicity" ordering="1">
TypePubOccasionnel <ValueParameter longName="Occasionnel"/>
</Criterion>
<Criterion name="JuraCombi" ordering="2">
Oui_Combi <ValueParameter longName="Oui_Combi"/>
^^^^^^^^^^^^^^^^^^^^
</Criterion>
</OrderHeader>
<FirstIssueData prodDate="21.11.2018"></FirstIssueData>
</Order> ^^^^^^^^^^^^^^^^^^^^^
</Manuscript>
我在其中创建变量的XSL部分:
<xsl:for-each select="Order/OrderHeader/Criterion">
<xsl:if test="@name = 'JuraCombi'">
<xsl:if test="ValueParameter/@longName = 'Oui_Combi'">
<xsl:variable name="JuraCombi">
OUI
</xsl:variable>
<xsl:variable name="Publication">
<xsl:value-of select="/Order/FirstIssueData/@prodDate" />
</xsl:variable>
</xsl:if>
<xsl:if test="ValueParameter/@longName != 'Oui_Combi'">
<xsl:variable name="JuraCombi">
NON
</xsl:variable>
<xsl:variable name="Publication">
<xsl:value-of select="/Order/OrderHeader/@productionDates" />
</xsl:variable>
</xsl:if>
</xsl:if>
</xsl:for-each>
...
我要在其中打印变量$Publication
的XSL部分:
<xsl:template match="OrderHeader">
<fo:table
table-layout="fixed"
width="18cm"
font-size="10pt"
padding="1.0pt">
<fo:table-column column-width="30mm"/>
<fo:table-column column-width="60mm"/>
<fo:table-column column-width="30mm"/>
<fo:table-column column-width="60mm"/>
<fo:table-body>
...
<fo:table-row>
<fo:table-cell>
<fo:block padding="0.5cm">
Parutions
</fo:block>
</fo:table-cell>
<fo:table-cell number-columns-spanned="3">
<fo:block padding="0.5cm">
<xsl:copy-of select="$Publication" />
</fo:block> ^^^^^^^^^^^^
</fo:table-cell>
</fo:table-row>
...
</fo:table-body>
</fo:table>
</xsl:template>
也许我们可以在没有for-each的情况下实现它?
没有任何在线XSLT工具/检查器可以使我得到详细的错误,但是渲染停止了!
感谢帮助
答案 0 :(得分:1)
XSLT变量的范围仅限于包含xsl:variable
的元素,并且仅适用于xsl:variable
之后的表达式。即,如XSLT 1.0规范中所述,“绑定对于所有后续的同级兄弟及其子代都是可见的”(请参见https://www.w3.org/TR/1999/REC-xslt-19991116#local-variables)。
因此,变量超出了声明变量xsl:if
的范围。
要做的是将逻辑由内到外,并将条件逻辑放入每个xsl:variable
元素中。诸如此类(未经测试):
<xsl:variable name="JuraCombi">
<xsl:choose>
<xsl:when test="ValueParameter/@longName = 'Oui_Combi'">OUI</xsl:when>
<xsl:otherwise>NON</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Publication">
<xsl:choose>
<xsl:when test="ValueParameter/@longName = 'Oui_Combi'">
<xsl:value-of select="/Manuscript/Order/FirstIssueData/@prodDate" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../@productionDates" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
请注意,您用于选择@prodDate
的XPath不会选择任何内容。它需要/Manuscript
步骤,因为Manuscript
是文档元素。
尚不清楚您的变量声明代码与创建fo:table
的模板之间的关系。为了使变量值能够适用,您需要具有xsl:apply-templates
来选择OrderHeader
,使其处于变量声明的范围内,并且需要传递变量的值。使用xsl:with-param
和xsl:param
到模板的值。参见https://www.w3.org/TR/1999/REC-xslt-19991116#section-Passing-Parameters-to-Templates。
我不确定我的意思是什么,所以这是我可以理解的最佳解决方案:
<xsl:template match="Order">
<xsl:variable name="JuraCombi">
<xsl:choose>
<xsl:when test="OrderHeader/Criterion[@name = 'JuraCombi']/ValueParameter/@longName = 'Oui_Combi'">OUI</xsl:when>
<xsl:otherwise>NON</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Publication">
<xsl:choose>
<xsl:when test="$JuraCombi = 'OUI'">
<xsl:value-of select="FirstIssueData/@prodDate" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="OrderHeader/@productionDates" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<fo:table
table-layout="fixed"
width="18cm"
font-size="10pt"
padding="1.0pt">
<fo:table-column column-width="30mm"/>
<fo:table-column column-width="60mm"/>
<fo:table-column column-width="30mm"/>
<fo:table-column column-width="60mm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block padding="0.5cm">
Parutions
</fo:block>
</fo:table-cell>
<fo:table-cell number-columns-spanned="3">
<fo:block padding="0.5cm">
<xsl:copy-of select="$Publication" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</xsl:template>