【问题标题】:Checking parent's preceding siblings XSLT检查父母前面的兄弟姐妹 XSLT
【发布时间】:2017-04-10 20:07:31
【问题描述】:

给定:

<pm>
    <content>
        <pmEntry>
            <pmEntryTitle>Test</pmEntryTitle>
            <dmRef>
                <dmRefIdent>
                    <dmCode infoCode="100" infoCodeVariant="A" />
                </dmRefIdent>
            </dmRef>
        </pmEntry>
        <pmEntry>
            <pmEntryTitle>Test2</pmEntryTitle>
            <dmRef>
                <dmRefIdent>
                    <dmCode infoCode="200" infoCodeVariant="A" />
                </dmRefIdent>
            </dmRef>
        </pmEntry>
        <pmEntry>
            <pmEntryTitle>Test3</pmEntryTitle>
            <dmRef>
                <dmRefIdent>
                    <dmCode infoCode="300" infoCodeVariant="A" />
                </dmRefIdent>
            </dmRef>
        </pmEntry>
    </content>
</pm>

我想从第一个&lt;dmRef&gt; 中的第一个&lt;pmEntry&gt; 调用目录模板

但这并没有给出预期的输出,它有时会从 pmEntry 列表的中间以及第一个 pmEntry 再次调用 TOC。

<xsl:if test="ancestor::content[count(pmEntry) > 1]/pmEntry and count(../preceding-sibling::pmEntry) = 0">
    <xsl:call-template name="contents" />
</xsl:if>

我不明白为什么count(../preceding-sibling::pmEntry) 在 pmEntries 列表的中间返回 0。

任何帮助或建议我们都将不胜感激。

这是完整的模板:

 <xsl:template match="pmEntry/dmRef">
               <!-- Front Matter template infocode = 001 before TOC-->
  <xsl:choose>
            <xsl:when test="ancestor::content/pmEntry/dmRef/dmRefIdent/dmCode[@infoCode='001']">
                    <xsl:apply-templates/>
                    <xsl:if test="dmRefIdent/dmCode/@infoCode='001'">
                        <xsl:call-template name="contents" />
                        <xsl:call-template name="figlist" >
                        </xsl:call-template>
                    </xsl:if>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:choose>
                    <!--Only one pmEntry, at first dmRef create TOC -->
                        <xsl:when test="ancestor::content[count(pmEntry) = 1]/pmEntry and count(preceding-sibling::dmRef) = 0">
                            <xsl:call-template name="contents" />
                            <xsl:call-template name="figlist" />
                        </xsl:when>
                        <!--Multiple pmEntry, at first create TOC -->
                        <xsl:when test="count(../preceding-sibling::pmEntry)=0 and count(../preceding-sibling::dmRef)=0">
                            <xsl:call-template name="contents" />
                            <xsl:call-template name="figlist" />
                        </xsl:when>
                        <xsl:otherwise />
                    </xsl:choose>
                    <xsl:apply-templates/>
                </xsl:otherwise>
            </xsl:choose>       
           </xsl:template>

【问题讨论】:

    标签: xml xpath xslt-1.0


    【解决方案1】:

    你可以试试这个。如果这不是您想要的,请告诉我们您的输出。

    <xsl:template match="dmRef">
      <xsl:if test="count(../preceding-sibling::pmEntry)=0 and count(preceding-sibling::dmRef)=0">
        <xsl:call-template name="contents" />
      </xsl:if>
    </xsl:template>
    

    【讨论】:

    • 谢谢你,我尝试了你的建议,但我仍然得到两个 TOC,一个在开始时根据需要,一个在中间。所需的输出只是摆脱了那些无关的 TOC。
    • 我把它改成了&lt;xsl:if test="count(../preceding-sibling::pmEntry)=0 and count(../preceding-sibling::dmRef)=0"&gt;,这样就去掉了额外的目录,但逻辑似乎不对。
    • 所以,我发布的只是一个让您入门的代码片段。您可能还需要某种形式的身份功能。您能否发布您的代码以及您期望的 XML 模型?
    • 我不确定要发布什么 XML,这是一个 XSL-FO 项目,我正在使用 Antenna House 来查看 pdf 输出。 FO 树?
    • 如果不知道输出应该是什么样子,我将无法为您提供帮助。让我知道,如果你想让我删除我的答案。然后也许其他人会来帮助你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多