【问题标题】:XSLT: Populating child node content repeating with parent node elemntsXSLT:填充与父节点元素重复的子节点内容
【发布时间】:2015-11-29 10:49:00
【问题描述】:

我正在尝试使用 XSLT 将 XML 从一种形式转换为另一种形式。

我输入的 XML 为

<Employee>
<Emp>
    <EMPID>123</EMPID>
    <NAME>James</NAME>
    <Sequence>1</Sequence>
    <JOBS>
        <COMPANY>ABC</COMPANY>
        <DESIGNATION>Developer</DESIGNATION>
    </JOBS>
    <JOBS>
        <COMPANY>DEF</COMPANY>
        <DESIGNATION>Tester</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>456</EMPID>
    <NAME>Clark</NAME>
    <Sequence>2</Sequence>
    <JOBS>
        <COMPANY>GHT</COMPANY>
        <DESIGNATION>QA Lead</DESIGNATION>
    </JOBS>
    <JOBS>
        <COMPANY>Levor</COMPANY>
        <DESIGNATION>Project Lead</DESIGNATION>
    </JOBS>
</Emp>
</Employee>

我想转换成(期望的输出)

<Employee>
<Emp>
    <EMPID>123</EMPID>
    <NAME>James</NAME>
    <Sequence>1</Sequence>
    <JOBS>
        <COMPANY>ABC</COMPANY>
        <DESIGNATION>Developer</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>123</EMPID>
    <NAME>James</NAME>
    <Sequence>1</Sequence>
    <JOBS>
        <COMPANY>DEF</COMPANY>
        <DESIGNATION>Tester</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>456</EMPID>
    <NAME>Clark</NAME>
    <Sequence>2</Sequence>
    <JOBS>
        <COMPANY>GHT</COMPANY>
        <DESIGNATION>QA Lead</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>456</EMPID>
    <NAME>Clark</NAME>
    <Sequence>2</Sequence>
    <JOBS>
        <COMPANY>Levor</COMPANY>
        <DESIGNATION>Project Lead</DESIGNATION>
    </JOBS>
</Emp>
</Employee>

我已经在 XSLT 下尝试过这个,但它没有工作,你能帮我纠正这个 XSLT 以获得期望的输出

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Employee">
    <xsl:element name="Employee">
        <xsl:for-each select="Employee">
            <xsl:sort select="Sequence"/>
            <xsl:element name="Emp">
                <xsl:copy-of select="EMPID"/>
                <xsl:copy-of select="NAME"/>
                <xsl:copy-of select="Sequence"/>
                <xsl:for-each select="child::JOBS">
                    <xsl:copy-of select="COMPANY"/>
                    <xsl:copy-of select="DESIGNATION"/>
                </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

请帮帮我?


补充:

感谢您的快速回复,但我忘记在此处添加一个案例,即 JOBS 汇总不适用于以下所有员工

<Employee>
<Emp>
    <EMPID>123</EMPID>
    <NAME>James</NAME>
    <Sequence>1</Sequence>
    <JOBS>
        <COMPANY>ABC</COMPANY>
        <DESIGNATION>Developer</DESIGNATION>
    </JOBS>
    <JOBS>
        <COMPANY>DEF</COMPANY>
        <DESIGNATION>Tester</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>789</EMPID>
    <NAME>Anderson</NAME>
    <Sequence>3</Sequence>
</Emp>
<Emp>
    <EMPID>456</EMPID>
    <NAME>Clark</NAME>
    <Sequence>2</Sequence>
    <JOBS>
        <COMPANY>GHT</COMPANY>
        <DESIGNATION>QA Lead</DESIGNATION>
    </JOBS>
    <JOBS>
        <COMPANY>Levor</COMPANY>
        <DESIGNATION>Project Lead</DESIGNATION>
    </JOBS>
</Emp>
</Employee>

所以这里Anderson没有emp,结果应该是这样的

<Employee>
<Emp>
    <EMPID>123</EMPID>
    <NAME>James</NAME>
    <Sequence>1</Sequence>
    <JOBS>
        <COMPANY>ABC</COMPANY>
        <DESIGNATION>Developer</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>123</EMPID>
    <NAME>James</NAME>
    <Sequence>1</Sequence>
    <JOBS>
        <COMPANY>DEF</COMPANY>
        <DESIGNATION>Tester</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>456</EMPID>
    <NAME>Clark</NAME>
    <Sequence>2</Sequence>
    <JOBS>
        <COMPANY>GHT</COMPANY>
        <DESIGNATION>QA Lead</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>456</EMPID>
    <NAME>Clark</NAME>
    <Sequence>2</Sequence>
    <JOBS>
        <COMPANY>Levor</COMPANY>
        <DESIGNATION>Project Lead</DESIGNATION>
    </JOBS>
</Emp>
<Emp>
    <EMPID>789</EMPID>
    <NAME>Anderson</NAME>
    <Sequence>3</Sequence>
</Emp>
</Employee>

你能帮帮我吗?

【问题讨论】:

    标签: xslt


    【解决方案1】:

    根据澄清进行了编辑:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/Employee">
        <xsl:copy>
            <xsl:apply-templates select="Emp">
                <xsl:sort select="Sequence"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template> 
    
    <xsl:template match="Emp[not(JOBS)]">
         <xsl:copy-of select="."/>
    </xsl:template>     
    
    <xsl:template match="Emp">
        <xsl:apply-templates select="JOBS"/>
    </xsl:template>                 
    
    <xsl:template match="JOBS">
        <Emp>
            <xsl:copy-of select="../EMPID | ../NAME | ../Sequence | ."/>
        </Emp>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 您可以将&lt;xsl:copy-of select="../EMPID | ../NAME | ../Sequence"/&gt; &lt;JOBS&gt; &lt;xsl:copy-of select="*"/&gt; &lt;/JOBS&gt; 缩短为&lt;xsl:copy-of select="../EMPID | ../NAME | ../Sequence | ."/&gt;
    • 感谢您的回复,我错过了添加我现在编辑的问题陈述。你能帮我解决这个问题吗?
    • 感谢 Michael 解决这个问题
    • @Rakesh 如果您的问题得到解答,请通过接受答案将其关闭。
    • 谢谢,这有助于我回答我的问题。你能帮忙把它关掉吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2021-02-02
    • 2022-09-23
    相关资源
    最近更新 更多