簡體   English   中英

FOP中子節點序列的XSLT

[英]XSLT for sequence of child nodes in FOP

使用Apache FOP,我想收集PDF文件中的一些信息。 我們可以說XML源有一些子節點

<node>
   <a>some val</a>
   <b>some other val</b>
   <c>more val</c>
   <d>even more val</d>
   <e>a last val</e>
</node>

我不想顯示所有這些。 a,b,c應始終顯示但可能是emtpy。 最大顯示值為3.因此,d和e是可選的,必須按此順序保存。

遺憾的是,XML結構無法修改。

什么是正確的XSLT? 我試過了

<xsl:for-each select="child::*[name()='a' or name() = 'b' or name() = 'c' or name() = 'd' or name() = 'e'][string-length(.)&gt;0]">
    <xsl:if test="position() &lt;= 3">
        <xsl:value-of select="name()"/>
    </xsl:if>
</xsl:for-each>

但這並沒有給我帶來有序的清單。 :(

<xsl:sort />應該是hep。

在你的情況下,它將是:

<xsl:sort select="name()"/>

因此嘗試:

    <xsl:for-each select="child::*[name()='a' or name() = 'b' or name() = 'c' or name() = 'd' or name() = 'e'][string-length(.)&gt;0]">
        <xsl:sort select="name()"/>
        <xsl:if test="position() &lt;= 3">
            <xsl:value-of select="name()"/>
        </xsl:if>
    </xsl:for-each>

更新:因為在實際輸入XML中沒有有用的信息可以排序,您可以添加一些元信息。 存儲元信息的位置取決於xslt處理器的功能。

如果你可以使用node-set()擴展,你可以嘗試這樣的事情:

使用預期順序向樣式表添加變量。

xsl:variable name="myOrder">
        <order name="a" pos="1" />
        <order name="b" pos="3" />
        <order name="c" pos="2" />
        <order name="d" pos="4" />
        <order name="e" pos="5" />
    </xsl:variable>

使此變量可用作節點設置:

<xsl:variable name="Order" select="exsl:node-set($myOrder)" />

借助此變量排序。

<xsl:sort select="$Order/order[@name= name(current())]/@pos"/>

@Florian Ruh,你聲明的要求不是自洽的:“我不想顯示所有這些要求。應始終顯示a,b,c。顯示的最大值為3.因此,d和e是可選的,必須按順序保留。“

如果始終顯示a,b和c,並且顯示的最大值數為3,則不會顯示d和3。

請澄清您的要求。

請注意,使用name()函數的形式非常糟糕。

相當於:

<xsl:for-each select="child::*[name()='a' or name() = 'b' or name() = 'c' or name() = 'd' or name() = 'e'][string-length(.)&gt;0]">

是:

<xsl:for-each select="(a|b|c|d|e)[string(.)]">

...我假設的方法是命名空間安全的,而你使用的方法則不是。

也許我沒有正確理解,但如果你只想將前三個項目歸還有序列表,你可以做類似的事情

<xsl:template match="node">
<fo:list-block>
<xsl:apply-templates/>
</fo:list-block>
</xsl:template>

<xsl:template match="node/*[4] | node/*[5]"/>
<xsl:template match="node/*[1] | node/*[2] | node/*[3]">
<fo:list-item>
<fo:list-item-label>
<fo:block><xsl:value-of select="position()"/></fo:block>
</fo:list-item-label>
<fo:list-item-body>
<fo:block><xsl:value-of select="."/></fo:block>
</fo:list-item-body>
</fo:list-item>
</xsl:template>

這將忽略任何第4和第5個元素,但按文檔順序處理第一個,第二個和第三個元素(因為這是它們遇到的順序)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM