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

时间:2016-07-13 21:30:24

标签: xml xslt xpath

我正在尝试使用我的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>

1 个答案:

答案 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-ofxsl:value-of之间的区别。使用xsl:copy-of复制整个节点,而xsl:value-of只输出它的字符串值。