xslt将原始的xml转换为新的xml

By simon at 2018-02-07 • 0人收藏 • 30人看过

我需要将原始的xml文档转换为另一个xml文档。 在新的XML文件,我不知道如何拉只有某些孩子和 然后是几个孙子孙女。目前我只是结束了 TE下的所有东西STRECORD节点,这给了我太多额外的数据。 任何帮助,将不胜感激。 输入XML:

<TOP>
  <LEVEL1>
    <TESTRECORD>
      <ENTRYID>267432</ENTRYID>
      <LINEID>254734</LINEID>
      <SEQUENCE>80</SEQUENCE>
      <LINE>
        <ASSETNUM>123456</ASSETNUM>
        <LINEID>254734</LINEID>
        <METERNAME> HCOLOR </METERNAME>
        <ASSET>
          <ASSETID>388391</ASSETID>
          <ASSETUID>388417</ASSETUID>
          <DESCRIPTION>My Asset Description</DESCRIPTION>
          <SERVICEADDRESS>
            <ADDRESSCODE>5308030000</ADDRESSCODE>
            <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
          </SERVICEADDRESS>
        </ASSET>
        <METER>
          <DESCRIPTION>Hair Color</DESCRIPTION>
          <DOMAINID>HCOLOR</DOMAINID>
          <METERNAME>HCOLOR</METERNAME>
        </METER>
      </LINE>
    </TESTRECORD >
    <TESTRECORD>
      <ENTRYID>555555</ENTRYID>
      <LINEID>222222</LINEID>
      <SEQUENCE>90</SEQUENCE>
      <LINE>
        <ASSETNUM>234567</ASSETNUM>
        <LINEID>222222</LINEID>
        <METERNAME> HCOLOR </METERNAME>
        <ASSET>
          <ASSETID>388391</ASSETID>
          <ASSETUID>388417</ASSETUID>
          <DESCRIPTION>My New Asset Description</DESCRIPTION>
          <SERVICEADDRESS>
            <ADDRESSCODE>5308030000</ADDRESSCODE>
            <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
          </SERVICEADDRESS>
        </ASSET>
        <METER>
          <DESCRIPTION>Hair Color</DESCRIPTION>
          <DOMAINID>HCOLOR</DOMAINID>
          <METERNAME>HCOLOR</METERNAME>
        </METER>
      </LINE>
    </TESTRECORD >
  </LEVEL1>
</TOP>
期望的输出:
<jobDocument>
<![CDATA[
<TESTRECORD>
    <ENTRYID>267432</ENTRYID>
    <LINEID>254734</LINEID>
    <SEQUENCE>80</SEQUENCE>
    <ASSETNUM>123456</ASSETNUM>
    <METERNAME>HCOLOR</METERNAME>
    <ASSETID>388391</ASSETID>
    <ASSETUID>388417</ASSETUID>
    <DESCRIPTION>My Asset Description</DESCRIPTION>
    <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
    <DESCRIPTION>Hair Color</DESCRIPTION>
    <DOMAINID>HCOLOR</DOMAINID>
</TESTRECORD>
<TESTRECORD>
    <ENTRYID>555555</ENTRYID>
    <LINEID>222222</LINEID>
    <SEQUENCE>90</SEQUENCE>
    <ASSETNUM>234567</ASSETNUM>
    <METERNAME>HCOLOR</METERNAME>
    <ASSETID>388391</ASSETID>
    <ASSETUID>388417</ASSETUID>
    <DESCRIPTION>My New Asset Description</DESCRIPTION>
    <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
    <DESCRIPTION>Hair Color</DESCRIPTION>
    <DOMAINID>HCOLOR</DOMAINID>
</TESTRECORD>
]]>
</jobDocument>
目前的XSLT没有给出预期的结果:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform”  
  version="1.0">
<xsl:output method="xml" cdata-section-elements="" />

<xsl:template match="/">

<jobDocument>
  <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:apply-templates mode="copy"
             select=" descendant::TESTRECORD" />
  <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>

</jobDocument>
</xsl:template>

<xsl:template match="*" mode="copy">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="node()" mode="copy" />
    </xsl:element>
</xsl:template>

<xsl:template match="text()|comment()" mode="copy">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

2 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

以下是一个样式表来压扁<TESTRECORD>以下的所有元素 确实包含了一些你没有提到的元素你想要的结果,但是 总体来说,输出接近你的预期。没有更多的标准 很难说哪个要包括的元素和要排除的元素。包装 输出在CDATA部分损害缩进 - 但不是structure - 输出。但是你应该明白这个模板。 *[count(descendant::*) > 0]匹配超过0个通道的所有元素孩子,那就是:全部 有孩子的元素。 *[self::TESTRECORD or count(descendant::*) = 0]匹配所有的元素 TESTRECORD本身或者没有孩子。这应该复制 TESTRECORD元素。如果你有不同的名字,你应该把它放在这里。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" cdata-section-elements="" />
<xsl:strip-space elements="*" />

  <xsl:template match="/">
    <jobDocument>
      <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
      <xsl:apply-templates mode="copy" select=" descendant::TESTRECORD" />
      <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </jobDocument>
  </xsl:template>

  <xsl:template match="*[count(descendant::*) > 0]" mode="copy">
    <xsl:apply-templates select="node()" mode="copy" />
  </xsl:template>

  <xsl:template match="*[self::TESTRECORD or count(descendant::*) = 0]" mode="copy">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="node()" mode="copy" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()|comment()" mode="copy">
    <xsl:copy/>
  </xsl:template>

</xsl:stylesheet>
输出(近似):
<?xml version="1.0"?>
<jobDocument><![CDATA[
    <TESTRECORD>
        <ENTRYID>267432</ENTRYID>
        <LINEID>254734</LINEID>
        <SEQUENCE>80</SEQUENCE>
        <ASSETNUM>123456</ASSETNUM>
        <LINEID>254734</LINEID>
        <METERNAME> HCOLOR </METERNAME>
        <ASSETID>388391</ASSETID>
        <ASSETUID>388417</ASSETUID>
        <DESCRIPTION>My Asset Description</DESCRIPTION>
        <ADDRESSCODE>5308030000</ADDRESSCODE>
        <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
        <DESCRIPTION>Hair Color</DESCRIPTION>
        <DOMAINID>HCOLOR</DOMAINID>
        <METERNAME>HCOLOR</METERNAME>
    </TESTRECORD>
    <TESTRECORD>
        <ENTRYID>555555</ENTRYID>
        <LINEID>222222</LINEID>
        <SEQUENCE>90</SEQUENCE>
        <ASSETNUM>234567</ASSETNUM>
        <LINEID>222222</LINEID>
        <METERNAME> HCOLOR </METERNAME>
        <ASSETID>388391</ASSETID>
        <ASSETUID>388417</ASSETUID>
        <DESCRIPTION>My New Asset Description</DESCRIPTION>
        <ADDRESSCODE>5308030000</ADDRESSCODE>
        <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
        <DESCRIPTION>Hair Color</DESCRIPTION>
        <DOMAINID>HCOLOR</DOMAINID>
        <METERNAME>HCOLOR</METERNAME>
    </TESTRECORD>]]>
</jobDocument>

2018-02-07   #2

以下是一个样式表来压扁<TESTRECORD>以下的所有元素 确实包含了一些你没有提到的元素你想要的结果,但是 总体来说,输出接近你的预期。没有更多的标准 很难说哪个要包括的元素和要排除的元素。包装 输出在CDATA部分损害缩进 - 但不是structure - 输出。但是你应该明白这个模板。 *[count(descendant::*) > 0]匹配超过0个通道的所有元素孩子,那就是:全部 有孩子的元素。 *[self::TESTRECORD or count(descendant::*) = 0]匹配所有的元素 TESTRECORD本身或者没有孩子。这应该复制 TESTRECORD元素。如果你有不同的名字,你应该把它放在这里。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" cdata-section-elements="" />
<xsl:strip-space elements="*" />

  <xsl:template match="/">
    <jobDocument>
      <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
      <xsl:apply-templates mode="copy" select=" descendant::TESTRECORD" />
      <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </jobDocument>
  </xsl:template>

  <xsl:template match="*[count(descendant::*) > 0]" mode="copy">
    <xsl:apply-templates select="node()" mode="copy" />
  </xsl:template>

  <xsl:template match="*[self::TESTRECORD or count(descendant::*) = 0]" mode="copy">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="node()" mode="copy" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()|comment()" mode="copy">
    <xsl:copy/>
  </xsl:template>

</xsl:stylesheet>
输出(近似):
<?xml version="1.0"?>
<jobDocument><![CDATA[
    <TESTRECORD>
        <ENTRYID>267432</ENTRYID>
        <LINEID>254734</LINEID>
        <SEQUENCE>80</SEQUENCE>
        <ASSETNUM>123456</ASSETNUM>
        <LINEID>254734</LINEID>
        <METERNAME> HCOLOR </METERNAME>
        <ASSETID>388391</ASSETID>
        <ASSETUID>388417</ASSETUID>
        <DESCRIPTION>My Asset Description</DESCRIPTION>
        <ADDRESSCODE>5308030000</ADDRESSCODE>
        <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
        <DESCRIPTION>Hair Color</DESCRIPTION>
        <DOMAINID>HCOLOR</DOMAINID>
        <METERNAME>HCOLOR</METERNAME>
    </TESTRECORD>
    <TESTRECORD>
        <ENTRYID>555555</ENTRYID>
        <LINEID>222222</LINEID>
        <SEQUENCE>90</SEQUENCE>
        <ASSETNUM>234567</ASSETNUM>
        <LINEID>222222</LINEID>
        <METERNAME> HCOLOR </METERNAME>
        <ASSETID>388391</ASSETID>
        <ASSETUID>388417</ASSETUID>
        <DESCRIPTION>My New Asset Description</DESCRIPTION>
        <ADDRESSCODE>5308030000</ADDRESSCODE>
        <STREETADDRESS>1234 Kings Highway</STREETADDRESS>
        <DESCRIPTION>Hair Color</DESCRIPTION>
        <DOMAINID>HCOLOR</DOMAINID>
        <METERNAME>HCOLOR</METERNAME>
    </TESTRECORD>]]>
</jobDocument>

登录后方可回帖

Loading...