我正在尝试使用我的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>
答案 0 :(得分:2)
您似乎想要创建一个名称来自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
只输出它的字符串值。