gpt4 book ai didi

xml - XSLT/XPath 获取当前节点号

转载 作者:数据小太阳 更新时间:2023-10-29 02:57:55 25 4
gpt4 key购买 nike

我要转换以下 xml 数据结构:

 <root>
<main1>
<text-body>
<title>A</title>
<subtitle>A</subtitle>
</text-body>
<!-- other stuff -->
<text-body>
<titel>Aa</titel>
<subtitel>Aa</subtitel>
</text-body>
<!-- other stuff -->
<text-body>
<titel>Aaa</titel>
<subtitel>Aaa</subtitel>
</text-body>
</main1>
<main2>
<text-body>
<title>B</title>
<subtitle>B</subtitle>
<body>B</body>
</text-body>
<text-body>
<title>C</title>
<subtitle>C</subtitle>
<body>C</body>
</text-body>
<text-body>
<title>D</title>
<subtitle>D</subtitle>
<body>D</body>
</text-body>
</main2>
</root>

我需要用 main2/text-body 中的数据替换 main/text-body 中的数据,但将其他内容保留在 main1 中。输出应如下所示:

<root>
<main1>
<text-body>
<title>B</title>
<subtitle>B</subtitle>
<body>B</body>
</text-body>
<!-- other stuff -->
<text-body>
<title>C</title>
<subtitle>C</subtitle>
<body>C</body>
</text-body>
<!-- other stuff -->
<text-body>
<title>D</title>
<subtitle>D</subtitle>
<body>D</body>
</text-body>
</main1>
<main2>
<text-body>
<title>B</title>
<subtitle>B</subtitle>
<body>B</body>
</text-body>
<text-body>
<title>C</title>
<subtitle>C</subtitle>
<body>C</body>
</text-body>
<text-body>
<title>D</title>
<subtitle>D</subtitle>
<body>D</body>
</text-body>
</main2>
</root>

我有以下 xsl 代码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="main1/text-body">
<xsl:param name="count" select="count(preceding-sibling::node())"/>
<xsl:copy-of select="/root/main2/text-body[$count]"/>
</xsl:template>

</xsl:stylesheet>

我尝试获取 main1/text-body 的当前节点索引,以填充 main2 的正确 text-body。但它不起作用。这是当前的输出:

<?xml version="1.0" encoding="UTF-8"?><root>
<main1>
<text-body>
<title>B</title>
<subtitle>B</subtitle>
<body>B</body>
</text-body>
<!-- other stuff -->

<!-- other stuff -->

</main1>
<main2>
<text-body>
<title>B</title>
<subtitle>B</subtitle>
<body>B</body>
</text-body>
<text-body>
<title>C</title>
<subtitle>C</subtitle>
<body>C</body>
</text-body>
<text-body>
<title>D</title>
<subtitle>D</subtitle>
<body>D</body>
</text-body>
</main2>
</root>

请帮忙!

最佳答案

XPath 和 XSLT 是从 1 开始的索引。为了选择第一项,您的谓词过滤器将寻找 [1],而不是 [0]

鉴于此,变量 $count 需要将 1 添加到先前兄弟选择的 count() 中。此外,您应该计算作为前 sibling 的 text-body 元素,而不是所有/任何 node()

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="main1/text-body">
<xsl:param name="count" select="count(preceding-sibling::text-body)+1"/>
<xsl:copy-of select="/root/main2/text-body[$count]"/>
</xsl:template>

</xsl:stylesheet>

关于xml - XSLT/XPath 获取当前节点号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com