我需要一个 XSL 样式表,它允许我移动 XML 元素以在前一个同级元素的最后一个元素之前进行打印

发布于 2024-10-21 22:28:31 字数 1156 浏览 1 评论 0原文

拜托,我需要你的帮助!

我需要一个 XSL 样式表,它允许我移动 XML 元素以在前一个同级元素的最后一个元素(或它可能是)之前打印。我的 if 语句是:

IF(<工具> 或 <零件>)和 <计划>存在于 XML 中,那么 MOVE <计划>打印之前(<工具> 或 <零件>) 否则只需<应用模板/>。

我已经尝试了几件事,但在之前我无法打印它。或者在某些文件中,它是

XML 如下:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <planning>Text for Planning</planning>
        <p>blah blah blah</p>
    </main>
</work>

如果上述条件存在,我希望我的输出为:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <planning>Text for Planning</planning>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <p>blah blah blah</p>
    </main>
</work>

任何人都可以帮助我实现这一目标吗?

提前致谢!!

琳达

Please, I need your help!!

I need an XSL stylesheet that lets me move an XML element to print before the preceding-sibling’s last element (<tools> or it could be <parts>). My if statement is:

IF (<tools> or <parts>) and <planning> exist in the XML, then
MOVE <planning> to print BEFORE (<tools> or <parts>)
OTHERWISE just <apply-templates />.

I've tried several things, but I just can't get it to print before <tools> or in some files, it's <parts>.

XML is as follows:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <planning>Text for Planning</planning>
        <p>blah blah blah</p>
    </main>
</work>

I want my output to be if the above condition exists:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <planning>Text for Planning</planning>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <p>blah blah blah</p>
    </main>
</work>

Can anyone help me on how to achieve this?

Thanks in advance!!

Linda

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゃ懵逼小萝莉 2024-10-28 22:28:31

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tools[not(preceding-sibling::parts)]|
                         parts[not(preceding-sibling::tools)]">
        <xsl:for-each select="../../main/planning">
            <xsl:call-template name="identity"/>
        </xsl:for-each>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="planning"/>
</xsl:stylesheet>

输出:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <planning>Text for Planning</planning>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <p>blah blah blah</p>
    </main>
</work>

其他模式的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tools[not(preceding-sibling::parts)]|
                         parts[not(preceding-sibling::tools)]">
        <xsl:apply-templates select="../../main/planning" mode="copy"/>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="planning"/>
    <xsl:template match="node()|@*" mode="copy">
        <xsl:call-template name="identity"/>
    </xsl:template>
</xsl:stylesheet>

This stylesheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tools[not(preceding-sibling::parts)]|
                         parts[not(preceding-sibling::tools)]">
        <xsl:for-each select="../../main/planning">
            <xsl:call-template name="identity"/>
        </xsl:for-each>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="planning"/>
</xsl:stylesheet>

Output:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <planning>Text for Planning</planning>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <p>blah blah blah</p>
    </main>
</work>

Other approach with modes:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tools[not(preceding-sibling::parts)]|
                         parts[not(preceding-sibling::tools)]">
        <xsl:apply-templates select="../../main/planning" mode="copy"/>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="planning"/>
    <xsl:template match="node()|@*" mode="copy">
        <xsl:call-template name="identity"/>
    </xsl:template>
</xsl:stylesheet>
那支青花 2024-10-28 22:28:31

此转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match=
 "/*/*[1]/*[not(self::tools or self::parts)]
             [not(preceding-sibling::*[self::tools or self::parts])]
                                         [last()]">
  <xsl:call-template name="identity"/>
  <xsl:copy-of select="../following-sibling::*[1]/planning"/>
 </xsl:template>
 <xsl:template match="planning"/>
</xsl:stylesheet>

当应用于提供的 XML 文档时:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <planning>Text for Planning</planning>
        <p>blah blah blah</p>
    </main>
</work>

准确产生所需的正确结果:

<work>
   <prelim>
      <code>ABC</code>
      <source>DEF</source>
      <planning>Text for Planning</planning>
      <tools>Includes codes for a table</tools>
   </prelim>
   <main>
      <p>blah blah blah</p>
   </main>
</work>

说明

  1. < p>身份规则(模板)“按原样”复制每个节点。

  2. 两个模板覆盖身份规则 - 一个用于防止规划的“就地复制”,另一个用于执行实际的移动操作。

  3. 执行移动操作的覆盖模板具有以下属性:

    它匹配满足以下条件的任何元素:1) 是顶部元素的第一个子元素的子元素,2) 不是 toolparts,并且 3)前面没有 toolparts 的同级元素,并且 4) 是满足 1)、2) 和 3) 的任何元素中的最后一个。

    操作很简单:该模板通过按名称调用身份规则来复制当前节点。然后,它复制其“表兄弟”——其父元素的第一个同级元素的 planning child`。

This transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match=
 "/*/*[1]/*[not(self::tools or self::parts)]
             [not(preceding-sibling::*[self::tools or self::parts])]
                                         [last()]">
  <xsl:call-template name="identity"/>
  <xsl:copy-of select="../following-sibling::*[1]/planning"/>
 </xsl:template>
 <xsl:template match="planning"/>
</xsl:stylesheet>

when applied on the provided XML document:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <planning>Text for Planning</planning>
        <p>blah blah blah</p>
    </main>
</work>

produces exactly the wanted, correct result:

<work>
   <prelim>
      <code>ABC</code>
      <source>DEF</source>
      <planning>Text for Planning</planning>
      <tools>Includes codes for a table</tools>
   </prelim>
   <main>
      <p>blah blah blah</p>
   </main>
</work>

Explanation:

  1. The identity rule (template) copies every node "as-is".

  2. Two templates override the identity rule -- one to prevent the "copy inplace" of planning, the other to do the actual move operation.

  3. The overriding template that performs the move operation has the following properties:

    It matches any element that: 1) is a child of the first child of the top element, and 2) is not a tool or parts, and 3) has no preceding sibling that is a tool or a parts, and 4) is the last of any element that satisfies 1), 2), and 3).

    The action is simple: this template copies the current node by calling the identity rule by name. Then it copies its "cousin" -- the planning child` of the first following sibling of its parent element.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文