使用XSLT 1.0重新组合节点

时间:2016-02-27 00:14:55

标签: xml xslt

我似乎在将几个xml文件重新格式化为对我正在使用的其他工具更容易获取的分组时出现问题...

另外,我仅限于使用XSLT 1.0来解决这个问题。

以下是我在文件夹“C:/ SampleFolder”中组织输入XML文件的示例样式:

<data>
   <PersonID>12345</PersonID>
   <PersonName>Gary Johnson</PersonName>
   <PersonDetails>
      <CurrAcct status="Y">
         <LastUpdated>26 FEB 2016</LastUpdated>
         <Comments>THIS IS AN INTERESTING COMMENT</Comments>
      </CurrAcct>
      <Threshold status="Y">
         <LastUpdated>01 FEB 2016</LastUpdated>
         <Comments>Blah Blah Blah</Comments>
      </Threshold>
   </PersonDetails>
</data>

以下是我希望它的样子:

<data>
   <PersonID>12345</PersonID>
   <PersonName>Gary Johnson</PersonName>
   <PersonDetails>
      <CurAcct>Y</CurrAcct>
      <CurrAcctLastUpdated>26 FEB 2016</CurrAcctLastUpdated>
      <CurrAcctComments>THIS IS AN INTERESTING COMMENT</CurrAcctComments>
      <Threshold>Y</Threshold>
      <ThresholdLastUpdated>01 FEB 2016</ThresholdLastUpdated>
      <ThresholdComments>Blah Blah Blah</ThresholdComments>
   </PersonDetails>
</data>

基本上我想做的是三件事(按优先顺序排列):

  1. 我希望能够将所有节点重组为“PersonDetails”

  2. 将以前的子节点重命名,以便在将xml中的数据导出到表中时,它们不会全部填入一个字段。

  3. 我希望能够以某种方式批量处理所有这些...我先尝试解决这个问题,但似乎找不到能让我有效地做到这一点的事情(即:在XLST 1.0中使用通配符来获取文件夹中的所有xml,因为collection()函数不可用。

  4. 附加说明:

    - 实际上,xml文件要大得多,有更多细节,最终我只是为每个不同的分组推出了特定的重新格式标准。除非你们都认为这是一个完全愚蠢的想法,在这种情况下 - 我总是乐于学习新东西。

    好吧,我认为就是这样。我真的碰到了这个砖墙,所以提前谢谢大家...

1 个答案:

答案 0 :(得分:2)

实现这一目标的一种可能性是以下XSLT模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="/data">
    <data>
        <xsl:copy-of select="*[local-name() != 'PersonDetails']" />
        <PersonDetails>
            <xsl:apply-templates select="PersonDetails" />
        </PersonDetails>
    </data>
  </xsl:template>

  <xsl:template match="CurrAcct | Threshold">
    <xsl:variable name="cur" select="local-name()" />
    <xsl:element name="{$cur}">
        <xsl:value-of select="@status" />
    </xsl:element>
    <xsl:for-each select="*">
        <xsl:element name="{concat($cur,local-name())}">
            <xsl:value-of select="text()" />
        </xsl:element>
    </xsl:for-each>
  </xsl:template> 
</xsl:stylesheet> 

结果是

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <PersonID>12345</PersonID>
    <PersonName>Gary Johnson</PersonName>
    <PersonDetails>
        <CurrAcct>Y</CurrAcct>
        <CurrAcctLastUpdated>26 FEB 2016</CurrAcctLastUpdated>
        <CurrAcctComments>THIS IS AN INTERESTING COMMENT</CurrAcctComments>
        <Threshold>Y</Threshold>
        <ThresholdLastUpdated>01 FEB 2016</ThresholdLastUpdated>
        <ThresholdComments>Blah Blah Blah</ThresholdComments>
    </PersonDetails>
</data>