我有一个包含多个子节点的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>
我想复制
BlockName
和TemplateName
从MultiBlockBlockBlockDefBlockName
和MultiBlockBlockBlockDefTemplateName
到MultiBlockBlockParameters
从
MultiBlockBlockEmbBlocksBlockBlockDefBlockName
和MultiBlockBlockEmbBlocksBlockBlockDefTemplateName
到相应MultiBlockBlockEmbBlocksParameters
的相应BlockName
和TemplateName
我至少尝试过用下面的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>