例如,将xml1视为:
Nothing
将xml2视为:
<hexam>
<exam>
<weightage>2</weightage>
<examid>1</examid>
<responseoption>
<opt1>kiwi</opt1>
<opt2>lemon</opt2>
</responseoption>
<selectedoption>
</selectedoption>
</exam>
<exam>
<weightage>3</weightage>
<examid>2</examid>
<responseoption>
<opt1>apple</opt1>
<opt2>orange</opt2>
</responseoption>
<selectedoption>
</selectedoption>
</exam>
</hexam>
现在这是处理xsl后我的输出的样子:
<hexam>
<exam>
<weightage>
</weightage>
<examid>1</examid>
<responseoption>
</responseoption>
<selectedoption>
<opt2>lemon</opt2>
</selectedoption>
</exam>
</hexam>
我的XSLT编码基于第二个xml(xml2),所以我的输出xml应该从xml1中获取weightage,examid,responseoption以及xml2中的选定选项。如果与xml1进行比较,则xml2中没有testid,那么整个孩子必须从xml1处理与该检查对应的检查节点。请帮帮我。请参阅我的输出xml。
答案 0 :(得分:0)
根据共享输入XML,xml1
似乎是包含问题的XML,而xml2
是与xml1
问题的回复相对应的<。{1}}。
从输出的结构中,更容易的选择是将<selectedoption>
中的xml2
元素合并到匹配xml1
的{{1}}结构中,但是因为您的要求是在<examid>
上应用XSLT,您可以尝试以下解决方案。
xml2
输出
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:param name="xml1" select="document('xml1.xml')/hexam"/>
<xsl:template match="hexam">
<hexam>
<xsl:for-each select="exam">
<xsl:variable name="examid2" select="examid" />
<xsl:variable name="selectedoption2" select="selectedoption" />
<xsl:for-each select="$xml1/exam">
<xsl:choose>
<xsl:when test="$examid2 = examid">
<exam>
<xsl:copy-of select="weightage | examid | responseoption" />
<xsl:copy-of select="$selectedoption2" />
</exam>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</hexam>
</xsl:template>
</xsl:stylesheet>