0

我想在 Antenna House 中使用 node-set() ,这样我就可以访问排序列表中的前兄弟姐妹。(我正在尝试遵循此示例:[ using previous-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>
4

1 回答 1

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 的错误,您最好向我们展示一个最小但完整的样式表,以便我们重现该问题。

于 2017-04-24T17:13:58.433 回答