具有命名空间的多级XML的XML转换



我有一个包含多个子节点的XML文件
我需要将一个节点复制到另一个节点,以便读取excel作为一项简单的任务(我不需要循环到多个子节点(。

我的示例XML如下。

<MultiBlock xmlns="x-schema:ConfigFileSchema.xml">
<Block>
<BlockDef>
<BlockName>Block1</BlockName>
<EntityName>Block1</EntityName>
<TemplateName>SYSTEM:template1</TemplateName>
</BlockDef>
<Parameters>
<Parameter>
<ParamName>PARAM1</ParamName>
<ParamValue>PARAM1VALUE</ParamValue>
</Parameter>
<Parameter>
<ParamName>PARAM2</ParamName>
<ParamValue>PARAM2VALUE</ParamValue>
</Parameter>
...
...
<Parameter>
<ParamName>PARAMn</ParamName>
<ParamValue>PARAMnVALUE</ParamValue>
</Parameter>
</Parameters>
<EmbBlocks>
<Block>
<BlockDef>
<BlockName>EMBBLOCK1</BlockName>
<EntityName>Block1</EntityName>
<TemplateName>SYSTEM:template1</TemplateName>
</BlockDef>
<Block>
<Parameters>
<Parameter>
<ParamName>PARAM1</ParamName>
<ParamValue>PARAM1VALUE</ParamValue>
</Parameter>
<Parameter>
<ParamName>PARAM2</ParamName>
<ParamValue>PARAM2VALUE</ParamValue>
</Parameter>
...
...
<Parameter>
<ParamName>PARAMn</ParamName>
<ParamValue>PARAMnVALUE</ParamValue>
</Parameter>
</Parameters>
</Block>
</Block>
...
...
<Block>...</Block>
</EmbBlocks>
</Block>
</MultiBlock>

我想复制

  1. BlockNameTemplateNameMultiBlockBlockBlockDefBlockNameMultiBlockBlockBlockDefTemplateNameMultiBlockBlockParameters

  2. MultiBlockBlockEmbBlocksBlockBlockDefBlockNameMultiBlockBlockEmbBlocksBlockBlockDefTemplateName到相应MultiBlockBlockEmbBlocksParameters的相应BlockNameTemplateName

我至少尝试过用下面的XSL复制BlockName。但是输出是空白的。我不明白可能出了什么问题。请引导我。

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="@*|node()"/>
</dataroot>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/MultiBlock/Block/BlockDef/BlockName">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="/MultiBlock/Block/Parameters">
<Parameters>
<BlockName><xsl:value-of select="../../BlockName"/></BlockName>
<xsl:apply-templates select="@*|node()"/>
</Parameters>
</xsl:template>
</xsl:stylesheet>

感谢阅读:(

输入XML有一个与其关联的命名空间x-schema:ConfigFileSchema.xml,它需要映射到XSL中才能正确访问元素。XSLT元素现在应该看起来像

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="x-schema:ConfigFileSchema.xml">

当考虑与<BlockName><TemplateName>节点相关时,节点<Parameters>的XPath是不同的。因此,必须使用不同的模板分别处理此元素。

模板1-><Parameters>立即在<MultiBlock>

<xsl:template match="ns0:MultiBlock/ns0:Block/ns0:Parameters">
<xsl:copy>
<xsl:apply-templates select="../ns0:BlockDef/ns0:BlockName" />
<xsl:apply-templates select="../ns0:BlockDef/ns0:TemplateName" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>

模板2-><Parameters>深入<EmbBlocks>内部

<xsl:template match="ns0:MultiBlock/ns0:Block/ns0:EmbBlocks/ns0:Block/ns0:Block/ns0:Parameters">
<xsl:copy>
<xsl:apply-templates select="../../ns0:BlockDef/ns0:BlockName" />
<xsl:apply-templates select="../../ns0:BlockDef/ns0:TemplateName" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>

完成XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="x-schema:ConfigFileSchema.xml">
<xsl:output method="xml" />
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:MultiBlock/ns0:Block/ns0:Parameters">
<xsl:copy>
<xsl:apply-templates select="../ns0:BlockDef/ns0:BlockName" />
<xsl:apply-templates select="../ns0:BlockDef/ns0:TemplateName" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:MultiBlock/ns0:Block/ns0:EmbBlocks/ns0:Block/ns0:Block/ns0:Parameters">
<xsl:copy>
<xsl:apply-templates select="../../ns0:BlockDef/ns0:BlockName" />
<xsl:apply-templates select="../../ns0:BlockDef/ns0:TemplateName" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

输出

<MultiBlock xmlns="x-schema:ConfigFileSchema.xml">
<Block>
<BlockDef>
<BlockName>Block1</BlockName>
<EntityName>Block1</EntityName>
<TemplateName>SYSTEM:template1</TemplateName>
</BlockDef>
<Parameters>
<BlockName>Block1</BlockName>
<TemplateName>SYSTEM:template1</TemplateName>
<Parameter>
<ParamName>PARAM1</ParamName>
<ParamValue>PARAM1VALUE</ParamValue>
</Parameter>
<Parameter>
<ParamName>PARAM2</ParamName>
<ParamValue>PARAM2VALUE</ParamValue>
</Parameter>
<Parameter>
<ParamName>PARAMn</ParamName>
<ParamValue>PARAMnVALUE</ParamValue>
</Parameter>
</Parameters>
<EmbBlocks>
<Block>
<BlockDef>
<BlockName>EMBBLOCK1</BlockName>
<EntityName>Block1</EntityName>
<TemplateName>SYSTEM:template1</TemplateName>
</BlockDef>
<Block>
<Parameters>
<BlockName>EMBBLOCK1</BlockName>
<TemplateName>SYSTEM:template1</TemplateName>
<Parameter>
<ParamName>PARAM1</ParamName>
<ParamValue>PARAM1VALUE</ParamValue>
</Parameter>
<Parameter>
<ParamName>PARAM2</ParamName>
<ParamValue>PARAM2VALUE</ParamValue>
</Parameter>
<Parameter>
<ParamName>PARAMn</ParamName>
<ParamValue>PARAMnVALUE</ParamValue>
</Parameter>
</Parameters>
</Block>
</Block>
<Block />
</EmbBlocks>
</Block>
</MultiBlock>

相关内容

  • 没有找到相关文章

最新更新