使用XSLT进行XML映射

时间:2017-08-04 07:35:23

标签: xml xslt

我想将输入xml文件更改为给定格式。

我输入的xml是:

 <Syncaaa xmlns="http://www.w3.org/TR/html4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/html4/ Syncaaa.xsd" releaseID="9.2" versionID="2.0.1">
        <eee>
            <Sender>
                <BOD>qwqqs</BOD>
                <ID>1222</ID>
                <Code>Success</Code>
            </Sender>
        </eee>
        <ddd>
            <bbb>
                <EntityId>100</EntityId>
            </bbb>
            <aaa type="xoxo">
                <Item>
                    <Status>true</Status>
                    <zzzz>O</zzzz>
                </Item>
                <Item>
                    <Status>false</Status>
                    <zzzz>1</zzzz>
                </Item>
            </aaa>
        </ddd>
    </Syncaaa>

从xml以上,我想在xml部分下面提取。

<aaa type="xoxo">
    <Item>
        <Status>true</Status>
        <zzzz>O</zzzz>
    </Item>
    <Item>
        <Status>false</Status>
        <zzzz>1</zzzz>
    </Item>
</aaa>

并且,提取的xml的标签名称应该如下更改。

  • <ddd> - &gt; <Updatedaaa>
  • <Item> - &gt; <UpdateItem>
  • <Status> - &gt; <UpdatedStatus>
  • <zzzz> - &gt; <Updatedzzzz>

例外情况如下所示。

<Updatedaaa>
            <UpdateItem>
                <UpdatedStatus>true</UpdatedStatus>
                <Updatedzzzz>0</Updatedzzzz>
            </UpdateItem>
            <UpdateItem>
                <UpdatedStatus>false</UpdatedStatus>
                <Updatedzzzz>1</Updatedzzzz>
            </UpdateItem>
        </Updatedaaa>

我尝试使用以下xsl文件执行该任务。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
   </xsl:template>

<xsl:template match="ddd"> 
  <UpdatedItem> 
    <xsl:apply-templates select="@*"/>
    <UpdatedStatus>
      <xsl:apply-templates select="Status"/>
    </UpdatedStatus>
    <Updatedzzzz>
      <xsl:apply-templates select="zzzz"/>
    </Updatedzzzz>
  </UpdatedItem> 
</xsl:template>


  </xsl:stylesheet>

但它没有使用这个xsl文件。请帮我确定一下这个问题。

谢谢,

1 个答案:

答案 0 :(得分:2)

在输入XML xmlns="http://www.w3.org/TR/html4/"中关联的命名空间在XSL中缺失。需要在XSL中添加以下内容才能使用命名空间。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:html="http://www.w3.org/TR/html4/"
    exclude-result-prefixes="html">

然后可以通过将名称空间前缀添加到XML节点来访问XML数据。可以有多种解决方案来获得所需的输出,如下所示。

<强> XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:html="http://www.w3.org/TR/html4/"
    exclude-result-prefixes="html">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <Updatedaaa>
            <xsl:for-each select="//*/html:Item">
                <UpdatedItem>
                    <UpdatedStatus>
                        <xsl:value-of select="html:Status" />
                    </UpdatedStatus>
                    <Updatedzzzz>
                        <xsl:value-of select="html:zzzz" />
                    </Updatedzzzz>
                </UpdatedItem>
            </xsl:for-each>
        </Updatedaaa>
    </xsl:template>
</xsl:stylesheet>

当应用于输入XML共享时,此XSLT会生成所需的输出

<?xml version="1.0" encoding="UTF-8"?>
<Updatedaaa>
    <UpdatedItem>
        <UpdatedStatus>true</UpdatedStatus>
        <Updatedzzzz>O</Updatedzzzz>
    </UpdatedItem>
    <UpdatedItem>
        <UpdatedStatus>false</UpdatedStatus>
        <Updatedzzzz>1</Updatedzzzz>
    </UpdatedItem>
</Updatedaaa>