gpt4 book ai didi

c# - 如何使用 C# 将具有属性长度的 xml 空元素标记转换为开始标记和结束标记?

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:18 25 4
gpt4 key购买 nike

我想转换带有属性长度的xml空元素标签

<tag length=”3”/>xxxxxxx

分为开始标签和结束标签

<tag>xxx</tag>xxxx

使用 C# 或 XSLT

你有想法吗?

来自:

    <comment>
<opinion id="tag_1" length="93"/>
Un bon traiteur Findi Traiteur propose un choix de
<topicInstance id="tag_2" length="13"/>
pâtes cuites à la minute et d'
<topicInstance id="tag_3" length="9"/>
antipasti.
</comment>

收件人:

    <comment>
<opinion id="tag_1">
Un bon traiteur Findi Traiteur propose un choix de
<topicInstance id="tag_2">
pâtes cuites</topicInstance> à la minute et d'
<topicInstance id="tag_3">
antipasti</topicInstance>.
</opinion>
</comment>

最佳答案

这是一个实现所需处理的完整而简单的转换:

<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()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="*[@length]">
<xsl:variable name="vFollowingText" select=
"normalize-space(following-sibling::text()[1])"/>

<xsl:copy>
<xsl:apply-templates select="@*[not(name()='length')]"/>
<xsl:value-of select="substring($vFollowingText, 1, @length)"/>
<xsl:apply-templates/>
</xsl:copy>
<xsl:value-of select="substring($vFollowingText, @length+1)"/>
</xsl:template>

<xsl:template match="text()[preceding-sibling::*[1][@length]]"/>
</xsl:stylesheet>

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

<comment>
<opinion id="tag_1" length="93"/>
Un bon traiteur Findi Traiteur propose un choix de
<topicInstance id="tag_2" length="13"/>
pâtes cuites à la minute et d'
<topicInstance id="tag_3" length="9"/>
antipasti.
</comment>

产生了想要的、正确的结果:

<comment>
<opinion id="tag_1">Un bon traiteur Findi Traiteur propose un choix de</opinion><topicInstance id="tag_2">pâtes cuites </topicInstance>à la minute et d'<topicInstance id="tag_3">antipasti</topicInstance>.</comment>

更新:

根据@enguerran 的评论,<opinion>应该包含其余内容,这里是执行此操作的转换:

<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()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="*[@length]" mode="following">
<xsl:variable name="vFollowingText" select=
"normalize-space(following-sibling::text()[1])"/>

<xsl:copy>
<xsl:apply-templates select="@*[not(name()='length')]"/>
<xsl:value-of select="substring($vFollowingText, 1, @length)"/>
<xsl:apply-templates/>
</xsl:copy>
<xsl:value-of select="substring($vFollowingText, @length+1)"/>
</xsl:template>

<xsl:template match="*[@length and not(preceding-sibling::*/@length)]">
<xsl:copy>
<xsl:apply-templates select="@*[not(name()='length')]"/>
<xsl:apply-templates select="node()"/>
<xsl:apply-templates mode="following" select=
"following-sibling::text()[1] |following-sibling::*" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[preceding-sibling::*[1][@length]] | text()"/>
</xsl:stylesheet>

当此转换应用于所提供的 XML 文档(如上)时,会产生所需的正确结果:

<comment>
<opinion id="tag_1">
Un bon traiteur Findi Traiteur propose un choix de
<topicInstance id="tag_2">pâtes cuites </topicInstance>à la minute et d'<topicInstance id="tag_3">antipasti</topicInstance>.</opinion>
</comment>

关于c# - 如何使用 C# 将具有属性长度的 xml 空元素标记转换为开始标记和结束标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11086704/

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