gpt4 book ai didi

xml - 使用带有 XML 输入的 XSLT 创建具有动态元素名称的 XML 结构

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

我正在尝试获取我的 XML 文档并使用 XSLT 将其转换为不同的 XML 结构。

这是我的输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<ProcessData>
<FTPRemoteHost>RACHEL</FTPRemoteHost>
<CodeListValues>
<BCBSRI_FTP_GET>
<PARM>CD</PARM>
<VALUE>/Desktop/Rachel</VALUE>
<DTM/>
</BCBSRI_FTP_GET>
<BCBSRI_FTP_GET>
<PARM>FTPProfileName</PARM>
<VALUE>1234567890</VALUE>
<DTM>yyyyMMdd</DTM>
</BCBSRI_FTP_GET>
<BCBSRI_FTP_GET>
<PARM>FileName1</PARM>
<VALUE>Rachel.txt</VALUE>
<DTM>yyyyMMdd</DTM>
</BCBSRI_FTP_GET>
<BCBSRI_FTP_GET>
<PARM>MV/DEL</PARM>
<VALUE>MOVE</VALUE>
<DTM/>
</BCBSRI_FTP_GET>
<BCBSRI_FTP_GET>
<PARM>SFG_MBX</PARM>
<VALUE>/inbox/Rachel</VALUE>
<DTM/>
</BCBSRI_FTP_GET>
</CodeListValues>
</ProcessData>

我已经尝试了很多在这里找到的不同解决方案,但我无法让我的结构以我想要的方式出现。到目前为止,这是我的 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

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

<xsl:template match="/">
<table>
<xsl:for-each select="ProcessData/CodeListValues">
<xsl:for-each select="BCBSRI_FTP_GET">
<xsl:value-of select="PARM"/>
<xsl:value-of select="VALUE"/>
<xsl:value-of select="DTM"/>
</xsl:for-each>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

我需要输出遵循以下模式:

<CD>/Desktop/Rachel</CD>
<FTPProfileName>1234567890</FTPProfileName>
<DTM>yyyyMMdd</DTM>
<FileName1>Rachel.txt</FileName1>
<DTM>yyyyMMdd</DTM>
<MV/DEL>MOVE</MV/DEL>
<SFG_MBX>/inbox/Rachel</SFG_MBX>

最佳答案

您似乎想创建一个元素,其名称在 PARM 中指定。元素,包含 VALUE 的值.为此,您可以使用 xsl:element元素

<xsl:element name="{PARM}">
<xsl:value-of select="VALUE"/>
</xsl:element>

但是,您将无法获得您请求的准确结果,因为 /在元素名称中无效,因此 <MV/DEL>不是有效的 XML 元素。您需要翻译 /可能是有效的东西?

虽然初学者可以试试这个 XSLT(这会将 / 更改为 -)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:template match="/">
<table>
<xsl:for-each select="ProcessData/CodeListValues">
<xsl:for-each select="BCBSRI_FTP_GET">
<xsl:element name="{translate(PARM, '/', '-')}">
<xsl:value-of select="VALUE"/>
</xsl:element>
<xsl:copy-of select="DTM[normalize-space()]"/>
</xsl:for-each>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

请注意,在您问题的 XSLT 中,您有两个模板匹配 / .这被认为是 XSLT 中的错误,有两个模板以相同的优先级匹配相同的事物。 XSLT 可能会标记错误,也可能会忽略除最后一个模板之外的所有模板。

另请注意 xsl:copy-of 之间的区别和 xsl:value-of .使用 xsl:copy-of复制整个节点,而 xsl:value-of只是输出它的字符串值。

关于xml - 使用带有 XML 输入的 XSLT 创建具有动态元素名称的 XML 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38362025/

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