我有一个带有多个子节点的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
从MultiBlock\Block\BlockDef\BlockName
和MultiBlock\Block\BlockDef\TemplateName
到MultiBlock\Block\Parameters
分别从BlockName
和TemplateName
到MultiBlock\Block\EmbBlocks\Block\BlockDef\BlockName
的{{1}}和MultiBlock\Block\EmbBlocks\Block\BlockDef\TemplateName
我尝试了至少使用下面的XSL复制BlockName。但是输出为空。我无法理解可能出了什么问题。请引导我。
MultiBlock\Block\EmbBlocks\Parameters
感谢您的阅读:)
答案 0 :(得分:0)
输入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">
节点<Parameters>
的XPath与<BlockName>
和<TemplateName>
节点有关时是不同的。因此,必须使用不同的模板分别处理此元素。
模板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>