[英]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(.)>0]">
<xsl:if test="position() <= 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(.)>0]">
<xsl:sort select="name()"/>
<xsl:if test="position() <= 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(.)>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.