gpt4 book ai didi

XSLT 选择当前节点下的特定节点

转载 作者:行者123 更新时间:2023-12-02 22:35:24 25 4
gpt4 key购买 nike

我正在尝试为其他人解决这个问题,但我自己也遇到了问题。

我有 XML:

<Process>
<name>Pro1</name>
<duration>Dur1</duration>
<time>Time1</time>
<name>Pro2</name>
<duration>Dur2</duration>
<time>Time2</time>
<name>Pro3</name>
<duration>Dur3</duration>
<time>Time3</time>
<name>Pro4</name>
<duration>Dur4</duration>
<time>Time4</time>
<name>Pro5</name>
<duration>Dur5</duration>
<time>Time5</time>
</Process>

输出:

<Process>
<Process_Info>
<name>Pro1</name>
<duration>Dur1</duration>
<time>Time1</time>
</Process_Info>
<Process_Info>
<name>Pro2</name>
<duration>Dur2</duration>
<time>Time2</time>
</Process_Info>
<Process_Info>
<name>Pro3</name>
<duration>Dur3</duration>
<time>Time3</time>
</Process_Info>
<Process_Info>
<name>Pro4</name>
<duration>Dur4</duration>
<time>Time4</time>
</Process_Info>
<Process_Info>
<name>Pro5</name>
<duration>Dur5</duration>
<time>Time5</time>
</Process_Info>
</Process>

使用 XSLT:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:variable name ="varProcess" select ="Process"/>

<xsl:template match="Process">
<xsl:element name="Process">
<xsl:for-each select ="name">
<xsl:variable name ="posName" select ="position()"/>
<xsl:element name ="Process_Info">
<xsl:copy-of select ="."/>
<xsl:copy-of select="$varProcess/duration[$posName]"/>
<xsl:copy-of select="$varProcess/time[$posName]"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

然而,<duration><time>节点不会总是存在并且 <name>是唯一有保证的节点。因此,如果缺少我的 position()选择失败。

我怎样才能更改 XSLT 以使其在 <duration> 时也能正常工作?和/或 <time>不存在。

我的理论是,您选择当前名称节点下方的两个节点,如果它们是 <duration><time>他们被复制了?但不确定这将如何实现。

当前输出导致问题的示例。

输入:

<Process>
<name>Pro1</name>
<duration>Dur1</duration>
<time>Time1</time>
<name>Pro2</name>
<duration>Dur2</duration>
<time>Time2</time>
<name>Pro3</name>
<duration>Dur3</duration>
<time>Time3</time>
<name>Pro4</name>
<time>Time4</time>
<name>Pro5</name>
<duration>Dur5</duration>
</Process>

输出:

<Process>
<Process_Info>
<name>Pro1</name>
<duration>Dur1</duration>
<time>Time1</time>
</Process_Info>
<Process_Info>
<name>Pro2</name>
<duration>Dur2</duration>
<time>Time2</time>
</Process_Info>
<Process_Info>
<name>Pro3</name>
<duration>Dur3</duration>
<time>Time3</time>
</Process_Info>
<Process_Info>
<name>Pro4</name>
<duration>Dur5</duration> <!-- Should be in the below process_info -->
<time>Time4</time>
</Process_Info>
<Process_Info>
<name>Pro5</name>
</Process_Info>
</Process>

最佳答案

虽然在方法上有点“手动”,但这样做确实有效。可能有更优雅的方法来实现这一点

<xsl:template match="Process">
<xsl:element name="Process">
<xsl:for-each select ="name">
<xsl:element name ="Process_Info">
<xsl:copy-of select ="."/>
<xsl:variable name="firstSib" select="local-name(following-sibling::*[1])" />
<xsl:variable name="secondSib" select="local-name(following-sibling::*[2])" />
<xsl:choose>
<xsl:when test="$firstSib='duration'">
<xsl:copy-of select="following-sibling::*[1]"/>
<xsl:choose>
<xsl:when test="$secondSib='time'">
<xsl:copy-of select="following-sibling::*[2]"/>
</xsl:when>
<xsl:otherwise>
<time>SomeDefaultValueForMissingTime</time>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$firstSib='time'">
<duration>SomeDefaultValueForMissingDuration</duration>
<xsl:copy-of select="following-sibling::*[1]"/>
</xsl:when>
<xsl:otherwise>
<duration>SomeDefaultValueForMissingDuration</duration>
<time>SomeDefaultValueForMissingTime</time>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>

输入:

<Process>
<name>Pro1</name>
<duration>Dur1</duration>
<time>Time1</time>
<name>NameMissingDuration</name>
<time>TimeMissingDuration</time>
<name>NameMissingTime</name>
<duration>DurMissingTime</duration>
<name>NameMissingBoth</name>
<name>NormalName</name>
<duration>NormalDuration</duration>
<time>NormalTime</time>
</Process>

输出

<Process>
<Process_Info>
<name>Pro1</name>
<duration>Dur1</duration>
<time>Time1</time>
</Process_Info>
<Process_Info>
<name>NameMissingDuration</name>
<duration>SomeDefaultValueForMissingDuration</duration>
<time>TimeMissingDuration</time>
</Process_Info>
<Process_Info>
<name>NameMissingTime</name>
<duration>DurMissingTime</duration>
<time>SomeDefaultValueForMissingTime</time>
</Process_Info>
<Process_Info>
<name>NameMissingBoth</name>
<duration>SomeDefaultValueForMissingDuration</duration>
<time>SomeDefaultValueForMissingTime</time>
</Process_Info>
<Process_Info>
<name>NormalName</name>
<duration>NormalDuration</duration>
<time>NormalTime</time>
</Process_Info>
</Process>

关于XSLT 选择当前节点下的特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537036/

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