使用带有Antenna House XSL-FO XSLT的节点集

时间:2017-04-24 16:11:29

标签: xslt xsl-fo node-set

我想在Antenna House中使用node-set(),这样我就可以在排序列表中访问previous-siblings。 (我试图效仿这个例子:[using preceding-sibling with with xsl:sort

我不确定声明命名空间访问node-set()的语法是什么。 AH没有给出任何错误,但我对node-set()的调用失败了。我试过了:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="msxsl" version="1.0">

这是XML:

<illustratedPartsCatalog>
        <figure id="fig1">...</figure>
        <catalogSeqNumber assyCode="00" figureNumber="01" indenture="0" item="000" itemVariant="A" subSubSystemCode="0" subSystemCode="0" systemCode="00">
<itemSeqNumber itemSeqNumberValue="000">
<quantityPerNextHigherAssy>XX</quantityPerNextHigherAssy>
<partRef manufacturerCodeValue="00000" partNumberValue="11111-111">
</partRef>
<partSegment>
<itemIdentData>
<descrForPart>VALVE ASSEMBLY</descrForPart></itemIdentData>
</partSegment><applicabilitySegment><usableOnCodeAssy>X</usableOnCodeAssy>
</applicabilitySegment></itemSeqNumber></catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <figure id="fig2">...</figure>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
        <catalogSeqNumber>...</catalogSeqNumber>
    </illustratedPartsCatalog>

XSLT:

    <xsl:variable name="sortedCSN">
            <xsl:for-each select="illustratedPartsCatalog/catalogSeqNumber">
                <xsl:sort select="concat(itemSeqNumber/partRef/@partNumberValue, @figureNumber,@item)"/>
                <xsl:copy-of select="." />
            </xsl:for-each>
  </xsl:variable>

    <xsl:template name="SortParts2" >
            <xsl:for-each select="msxsl:node-set($sortedCSN)/catalogSeqNumber">
                <xsl:sort select="concat(itemSeqNumber/partRef/@partNumberValue, @figureNumber,@item)"/>
                <xsl:call-template name="catalogSeqNumber-NI">
                    <xsl:with-param name="figNo" select="concat(@figureNumber,@figureNumberVariant)"/>
                    <xsl:with-param name="prfigNo" select="concat(preceding-sibling::catalogSeqNumber/@figureNumber,preceding-sibling::catalogSeqNumber/@figureNumberVariant)" />
                </xsl:call-template>
            </xsl:for-each>
        </xsl:template>

    <xsl:template name="catalogSeqNumber-NI">
        <xsl:param name="figNo"/>
        <xsl:param name="prfigNo" />        
            <fo:table-row keep-together.within-page="always" wrap-option="wrap">
                <fo:table-cell xsl:use-attribute-sets="table.cell.padding" text-transform="uppercase" wrap-option="wrap">
                    <fo:block wrap-option="wrap">
                        <xsl:value-of select=" ./itemSeqNumber/partRef/@partNumberValue"/>
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell  xsl:use-attribute-sets="table.cell.padding" text-align="start">
                    <xsl:choose>
                        <xsl:when test="$figNo">
                            <fo:block>
                                <xsl:text> </xsl:text><xsl:value-of select="$figNo"/><xsl:text> </xsl:text> <xsl:value-of select="$prfigNo"/>
                            </fo:block>
                        </xsl:when>
                        <xsl:otherwise>
                                <fo:block />
                        </xsl:otherwise>
                    </xsl:choose>
                </fo:table-cell>

                <fo:table-cell  xsl:use-attribute-sets="table.cell.padding" text-align="start">
                    <fo:block>
                        <xsl:if test="./itemSeqNumber/partLocationSegment/notIllustrated">
                            <xsl:text>-</xsl:text>
                        </xsl:if>

                        <xsl:choose>
                            <xsl:when test="@item">
                                <xsl:variable name="itemNo">
                                    <xsl:call-template name="suppressZero" >
                                        <xsl:with-param name="pText" select="@item"/>
                                    </xsl:call-template>
                                </xsl:variable>
                                <xsl:text>&#160;</xsl:text>
                                <xsl:value-of select="concat($itemNo,@itemVariant)"/>
                            </xsl:when>
                            <xsl:otherwise />
                        </xsl:choose>
                    </fo:block>
                </fo:table-cell>

                <fo:table-cell xsl:use-attribute-sets="table.cell.padding">
                    <fo:block>
                        <xsl:value-of select="./itemSeqNumber/quantityPerNextHigherAssy"/>
                    </fo:block>
                </fo:table-cell>
            </fo:table-row>
        </xsl:template>

1 个答案:

答案 0 :(得分:1)

我认为Windows上Antenna House的默认设置是使用MSXML,因此只要使用xmlns:msxsl="urn:schemas-microsoft-com:xslt"扩展功能,node-set的尝试就可以了。

我认为您只需要将XSLT更改为

    <xsl:variable name="sortedCSN">
            <xsl:for-each select="illustratedPartsCatalog/catalogSeqNumber">
                <xsl:sort select="concat(itemSeqNumber/partRef/@partNumberValue, @figureNumber,@item)"/>
                <xsl:copy-of select="." />
            </xsl:for-each>
  </xsl:variable>

<xsl:template name="SortParts2" >
        <xsl:for-each select="msxsl:node-set($sortedCSN)/catalogSeqNumber">
            <xsl:sort select="concat(itemSeqNumber/partRef/@partNumberValue, @figureNumber,@item)"/>
            <xsl:call-template name="catalogSeqNumber-NI">
                <xsl:with-param name="figNo" select="concat(@figureNumber,@figureNumberVariant)"/>
                <xsl:with-param name="prfigNo" select="concat(preceding-sibling::catalogSeqNumber/@figureNumber,preceding-sibling::catalogSeqNumber/@figureNumberVariant)" />
            </xsl:call-template>
        </xsl:for-each>
    </xsl:template>

使用您显示的输入有意义(就您所显示的而言,无法查看所有xsl:sort次尝试而无需查看要排序的数据)。

另一方面,如果您收到样式表错误的XSLT或XML错误,您最好向我们展示一个最小但完整的样式表,以便我们重现问题。