代码之家  ›  专栏  ›  技术社区  ›  Balaganesh Mohanavel

自定义数据库收集所需的xslt解决方案

  •  -2
  • Balaganesh Mohanavel  · 技术社区  · 6 年前

    我需要从以下源XML转换

    <response_1 xmlns="http://www.example.org">
        <lines>
            <lineId>1</lineId>
            <item>item1</item>
            <configItem>
                <lineId>1</lineId>
                <configId>11</configId>
            </configItem>
            <configItem>
                <lineId>1</lineId>
                <configId>12</configId>
            </configItem>
        </lines>
        <lines>
            <lineId>2</lineId>
            <item>item2</item>
            <configItem>
                <lineId>2</lineId>
                <configId>21</configId>
            </configItem>
            <configItem>
                <lineId>2</lineId>
                <configId>22</configId>
            </configItem>
        </lines>
        <lines>
            <lineId>3</lineId>
            <item>item3</item>
         </lines>
    
    </response_1>
    

    目标XML如下

    <ns0:response_2 xmlns="http://www.example.org">
        <ns0:lines>
            <ns0:lineId>1</ns0:lineId>
            <ns0:item>item1</ns0:item>
            <ns0:configId>11</ns0:configId>
        </ns0:lines>
        <ns0:lines>
            <ns0:lineId>1</ns0:lineId>
            <ns0:item>item1</ns0:item>
            <ns0:configId>12</ns0:configId>
        </ns0:lines>
        <ns0:lines>
            <ns0:lineId>2</ns0:lineId>
            <ns0:item>item2</ns0:item>
            <ns0:configId>21</ns0:configId>
        </ns0:lines>
        <ns0:lines>
            <ns0:lineId>2</ns0:lineId>
            <ns0:item>item2</ns0:item>
            <ns0:configId>22</ns0:configId>
        </ns0:lines>
        <ns0:lines>
            <ns0:lineId>3</ns0:lineId>
            <ns0:item>item3</ns0:item>          
        </ns0:lines>
    </ns0:response_2>
    

    我曾尝试在xslt中使用创建变量,但未能成功。我是新手,请求帮助。请求你的帮助。我在这里用更新的源和目标编辑了代码

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aniket V    6 年前

    上面的注释已经建议处理默认命名空间 http://www.example.org 使用前缀或不使用前缀,但是如果输出XML中的元素需要与命名空间对应的前缀,则可以使用以下模板获取输出。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns0="http://www.example.org" > 
        <xsl:output method="xml" />
        <xsl:strip-space elements="*" />
    
        <xsl:template match="ns0:response_1">
            <ns0:response_2>
                <xsl:apply-templates />
            </ns0:response_2>
        </xsl:template>
    
        <xsl:template match="ns0:configItem">
            <ns0:lines>
                <ns0:lineId><xsl:value-of select="ns0:lineId" /></ns0:lineId>
                <ns0:item><xsl:value-of select="../ns0:item" /></ns0:item>
                <ns0:configId><xsl:value-of select="ns0:configId" /></ns0:configId>
            </ns0:lines>
        </xsl:template>
    
        <xsl:template match="ns0:lines[not(ns0:configItem)]">
            <ns0:lines>
                <ns0:lineId><xsl:value-of select="ns0:lineId" /></ns0:lineId>
                <ns0:item><xsl:value-of select="ns0:item" /></ns0:item>
            </ns0:lines>
        </xsl:template>
    
        <xsl:template match="ns0:lineId | ns0:item" />
    </xsl:stylesheet>