【问题标题】:XML Dynamic tag nameXML 动态标签名称
【发布时间】:2016-08-08 05:42:44
【问题描述】:

我是xslt 的新手,我需要动态更改标签名称。如 Source XML 所示,G_1 将包含 MapIDSTAGE_COLUMN_NAME ,我们需要从这里获取 VO_ATTRIBUTE_NAME 并将其替换为 G_2 中的 Tag 名称。

源 XML -

<?xml version="1.0" encoding="UTF-8"?>
<DATA_DS>
   <G_1>
      <MapID>100</MapID>
      <STAGE_COLUMN_NAME>XXDATE001</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>StartDate</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>100</MapID>
      <STAGE_COLUMN_NAME>XXDATE002</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>EndDate</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>100</MapID>
      <STAGE_COLUMN_NAME>XXVAL001</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>OrgID</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>100</MapID>
      <STAGE_COLUMN_NAME>XXVAL002</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>DepName</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>200</MapID>
      <STAGE_COLUMN_NAME>XXDATE001</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>StartDate Two</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>200</MapID>
      <STAGE_COLUMN_NAME>XXDATE002</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>EndDate Two</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>200</MapID>
      <STAGE_COLUMN_NAME>XXVAL001</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>DepID</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_1>
      <MapID>200</MapID>
      <STAGE_COLUMN_NAME>XXVAL002</STAGE_COLUMN_NAME>
      <VO_ATTRIBUTE_NAME>Division Name</VO_ATTRIBUTE_NAME>
   </G_1>
   <G_2>
      <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID>
      <MapID>100</MapID>
      <XXVAL002>Emergency Dept.-East - 400750</XXVAL002>
      <XXDATE001>1951-01-01T00:00:00.000+00:00</XXDATE001>
      <XXDATE002>4712-12-31T00:00:00.000+00:00</XXDATE002>
   </G_2>
   <G_2>
      <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID>
      <MapID>200</MapID>
      <XXVAL002>Emergency Division - 4353</XXVAL002>
      <XXDATE001>1951-01-01T00:00:00.000+00:00</XXDATE001>
      <XXDATE002>4712-12-31T00:00:00.000+00:00</XXDATE002>
   </G_2>
</DATA_DS>

目标 XML

<?xml version="1.0" encoding="UTF-8"?>
<DATA_DS>
   <G_2>
      <PHYSICAL_LINE_ID>100000007956555</PHYSICAL_LINE_ID>
      <DepName>Emergency Dept.-East - 400750</DepName>
      <StartDate>1951-01-01T00:00:00.000+00:00</StartDate>
      <EndDate>4712-12-31T00:00:00.000+00:00</EndDate>
   </G_2>
      <G_2>
      <PHYSICAL_LINE_ID>100000007956555</PHYSICAL_LINE_ID>
      <Division Name>Emergency Division - 4353</Division Name>
      <StartDate Two>1951-01-01T00:00:00.000+00:00</StartDate Two>
      <EndDate Two>4712-12-31T00:00:00.000+00:00</EndDate Two>
   </G_2>
</DATA_DS>

如果可能,请帮助我提供xslt 代码或任何有关此方向的提示。

【问题讨论】:

    标签: xml xslt tags


    【解决方案1】:

    有趣的小问题。这是一个 XSLT 1.0 解决方案:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:key name="fields" match="//G_1" use="concat(MapID/text(), STAGE_COLUMN_NAME/text())"/>
        <xsl:template match="/">
            <DATA_DS>
                <xsl:apply-templates select="//G_2"/>
            </DATA_DS>
        </xsl:template>
        <xsl:template match="G_2">
            <G_2>
                <xsl:apply-templates select="*"/>
            </G_2>
        </xsl:template>
        <xsl:template match="MapID"/>
        <xsl:template match="*">
            <xsl:variable name="id" select="concat(../MapID/text(),name())"/>
            <xsl:variable name="x" select="key('fields',$id)/VO_ATTRIBUTE_NAME/text()"/>
            <xsl:choose>
                <xsl:when test="$x">
                    <xsl:element name="{translate($x,' ','-')}">
                        <xsl:value-of select="text()"/>
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>
    </xsl:stylesheet>
    

    它使用一个键(映射)来查找标签名称并通过没有映射的未触及标签。请注意,元素名称不能包含空格,因此我将空格转换为连字符,这是合法的。

    样本输入的输出是:

    <?xml version="1.0" encoding="utf-8"?>
    <DATA_DS>
       <G_2>
          <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID>
          <DepName>Emergency Dept.-East - 400750</DepName>
          <StartDate>1951-01-01T00:00:00.000+00:00</StartDate>
          <EndDate>4712-12-31T00:00:00.000+00:00</EndDate>
       </G_2>
       <G_2>
          <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID>
          <Division-Name>Emergency Division - 4353</Division-Name>
          <StartDate-Two>1951-01-01T00:00:00.000+00:00</StartDate-Two>
          <EndDate-Two>4712-12-31T00:00:00.000+00:00</EndDate-Two>
       </G_2>
    </DATA_DS>
    

    【讨论】:

    • 非常感谢你,吉姆。它工作得很好。你救了我
    • 请点击左侧的复选标记“接受”答案。这标志着答案,以便其他人知道它解决了您的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 2017-05-28
    • 1970-01-01
    • 2015-03-27
    • 2020-09-11
    • 2019-04-30
    相关资源
    最近更新 更多