如何使用 XSLT 反转 XML 数据标签?

发布于 2024-10-31 00:28:15 字数 696 浏览 1 评论 0原文

例如,下面的 XML 文件。

<person>
    <name>John</name>
    <id>1</id>
    <name>Diane</name>
    <id>2</id>
    <name>Chris</name>
    <id>3</id>
</person>

现在, 在 XSLT 中,如果我编码:

<xsl:template match="person">
 <xsl:apply-templates/>
</xsl:template>

那么,在 HTML 文件中它将显示 John1Diane2Chris3。

但, 我需要以下输出: Diane2John1Chris3

我需要颠倒前 2 个数据标签的顺序。 下面是前 2 个标签,

<name>John</name>
<id>1</id>

<name>Diane</name>
<id>2</id>

大家有什么想法吗?

For example, below XML file.

<person>
    <name>John</name>
    <id>1</id>
    <name>Diane</name>
    <id>2</id>
    <name>Chris</name>
    <id>3</id>
</person>

Now,
In XSLT, If I code:

<xsl:template match="person">
 <xsl:apply-templates/>
</xsl:template>

So, In HTML file It will display John1Diane2Chris3.

But,
I need following output:
Diane2John1Chris3

I need to reverse order of first 2 data tags.
Here below first 2 tags

<name>John</name>
<id>1</id>

<name>Diane</name>
<id>2</id>

Any Idea folks ?

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

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

发布评论

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

评论(3

这个俗人 2024-11-07 00:28:15
<xsl:template match="person">
  <xsl:apply-templates select="name[2]|id[2]"/>
  <xsl:apply-templates select="name[position() != 2]|id[position() != 2]"/>
</xsl:template>

这假设总是有一个 nameid 对。如果情况并非如此,解决方案将会更加复杂。

<xsl:template match="person">
  <xsl:apply-templates select="name[2]|id[2]"/>
  <xsl:apply-templates select="name[position() != 2]|id[position() != 2]"/>
</xsl:template>

This assumes there is always a name and id pair. If that's not the case, solution will be more complex.

寄居者 2024-11-07 00:28:15

这是针对一个非常具体的问题的非常具体的解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="person">
        <xsl:apply-templates select="name[text()='Diane']|id[text()='2']" />
        <xsl:apply-templates select="name[not(text()='Diane')] |
                                       id[not(text()='2')]" />
    </xsl:template>
</xsl:stylesheet>

输出:

Diane2John1Chris3

更一般的解决方案需要对问题进行更一般的描述。

Here's a very specific solution to a very specific problem:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="person">
        <xsl:apply-templates select="name[text()='Diane']|id[text()='2']" />
        <xsl:apply-templates select="name[not(text()='Diane')] |
                                       id[not(text()='2')]" />
    </xsl:template>
</xsl:stylesheet>

Output:

Diane2John1Chris3

A more general solution would require a more general description of the problem.

泅人 2024-11-07 00:28:15

下面的代码将允许您控制要反转的第一个标签的数量,但我倾向于同意 lwburk 的观点,如果您确定您需要的只是反转两个第一个标签,那么它可能有点矫枉过正。

<xsl:template match="person">
         <xsl:for-each select="name[position() < 3]">
             <xsl:sort select="position()" data-type="number" order="descending"/>
             <xsl:apply-templates select="."/>
             <xsl:apply-templates select="./following-sibling::id[position() = 1]"/>
         </xsl:for-each>
         <xsl:apply-templates select="name[position() = 2]/following-sibling::*[position() > 1]"/>
</xsl:template>

The code below will allow you to control how much of first tags you want to reverse but I tend to agree with lwburk that it might be overkill if you know for sure that all you need is just to inverse only two first tags.

<xsl:template match="person">
         <xsl:for-each select="name[position() < 3]">
             <xsl:sort select="position()" data-type="number" order="descending"/>
             <xsl:apply-templates select="."/>
             <xsl:apply-templates select="./following-sibling::id[position() = 1]"/>
         </xsl:for-each>
         <xsl:apply-templates select="name[position() = 2]/following-sibling::*[position() > 1]"/>
</xsl:template>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文