从一个xml获取值,并根据条件将它们与其他xml节点匹配

时间:2018-04-04 00:42:06

标签: xslt

例如,将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。

1 个答案:

答案 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>