下午好, 我是XML和XSLT的新手,我正在尝试将下面的第一个XML转换为下面的第二个XML。任何帮助,将不胜感激。 XML用于数据馈送,因此它需要保持与原始格式相同的格式,但是我需要做的是为每个“ Questionnaire_ID”的每个“ Document_to_be_Requested”创建一个单独的“ item”。>
原始
<?xml version="1.0" encoding="utf-8"?>
<ex:Record xmlns:ex="http://archertech.com/Print/Export">
<ex:Item>
<ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 1</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>A</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 1</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>C</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 1</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>D</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 1</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>F</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 2</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>A</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 2</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>B</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 2</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>F</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
<ex:Item>
<ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
<ex:Target>
<ex:Item>Company 2</ex:Item>
</ex:Target>
<ex:Document_to_be_Requested>
<ex:Item>G</ex:Item>
</ex:Document_to_be_Requested>
</ex:Item>
</ex:Record>
期望
{{1}}
谢谢!
答案 0 :(得分:0)
从身份模板开始
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
然后有一个ex:Record/ex:Item
节点的模板匹配项。仅应用目标节点。
<xsl:template match="ex:Record/ex:Item">
<xsl:apply-templates select="ex:Document_to_be_Requested/*"/>
</xsl:template>
然后为目标节点创建模板
<xsl:template match="ex:Document_to_be_Requested/ex:Item">
<ex:Item>
<!-- copies the preceding siblings of parent node -->
<xsl:copy-of select="../preceding-sibling::*"/>
<ex:Document_to_be_Requested>
<!-- copies the current node -->
<xsl:copy-of select="."/>
</ex:Document_to_be_Requested>
</ex:Item>
</xsl:template>
整个样式表如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ex="http://archertech.com/Print/Export"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ex:Record/ex:Item">
<xsl:apply-templates select="ex:Document_to_be_Requested/*"/>
</xsl:template>
<xsl:template match="ex:Document_to_be_Requested/ex:Item">
<ex:Item>
<xsl:copy-of select="../preceding-sibling::*"/>
<ex:Document_to_be_Requested>
<xsl:copy-of select="."/>
</ex:Document_to_be_Requested>
</ex:Item>
</xsl:template>
</xsl:stylesheet>
查看实际情况here。