XMLXSLT转换:无法在另一个节点中获取一个节点

4dc9hkyq  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(408)

我对xslt还不熟悉,无法理解它。需要将下面的输入文件转换为下面的输出文件,有人能帮我用xslt代码吗。提前谢谢。输入文件:

<input>
    <inputOne>
        <numberOne>1</numberOne>
    </inputOne>
    <inputTwo>
        <numberTwo>2</numberTwo>
    </inputTwo>
    <inputThree>
        <numberThree>3</numberThree>
    </inputThree>
    <inputFive>
        <numberFive>5</numberFive>
    </inputFive>
    <inputFour>
        <numberFour>4</numberFour>
    </inputFour>
    <inputThree>
        <numberThree>32</numberThree>
    </inputThree>
    <inputFive>
        <numberFive>52</numberFive>
    </inputFive>
    <inputFour>
        <numberFour>42</numberFour>
    </inputFour>
</input>

输出文件:

<input>
    <inputOne>
        <numberOne>1</numberOne>
        <inputTwo>
            <numberTwo>2</numberTwo>

            <inputThree>
                <numberThree>3</numberThree>
                <inputFour>
                    <numberFour>4</numberFour>
                    <inputFive>
                        <numberFive>5</numberFive>
                    </inputFive>
                </inputFour>
            </inputThree>

            <inputThree>
                <numberThree>32</numberThree>
                <inputFour>
                    <numberFour>42</numberFour>
                    <inputFive>
                        <numberFive>52</numberFive>
                    </inputFive>
                </inputFour>
            </inputThree>

        </inputTwo>
    </inputOne>
</input>

我正在使用transformer对象将streamsource转换为streamresult对象。transform对象是使用xsl文件创建的。
我的xsl文件不工作。
XSL代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8"/>
    <xsl:template match="/input">
        <xsl:copy>
            <xsl:apply-templates select="inputOne"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="inputOne">
        <xsl:apply-templates select="inputTwo"/>
    </xsl:template>
    <xsl:template match="inputOne[not(inputTwo)]">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="inputTwo">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

使用上面的xsl,我试图获得inputone标签,并在其中输入wo标签。但我只想了解一下:

<input>
<inputOne>
        <numberOne>1</numberOne>
    </inputOne>

</input>

感谢您对修复xsl代码的帮助。谢谢。

h43kikqp

h43kikqp1#

fwiw,下面的样式表将通过大量的努力生成问题中显示的结果。我不清楚这里实现的逻辑是否适合所有可能的输入。
xslt 1.0版

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" oversion="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="in4" match="inputFour" use="generate-id(preceding-sibling::inputThree[1])" />
<xsl:key name="in5" match="inputFive" use="generate-id(following-sibling::inputFour[1])" />

<xsl:template match="/input">
    <xsl:copy>
        <xsl:apply-templates select="inputOne"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="inputOne">
    <xsl:copy>
        <xsl:copy-of select="numberOne"/>
        <xsl:apply-templates select="../inputTwo"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="inputTwo">
    <xsl:copy>
        <xsl:copy-of select="numberTwo"/>
        <xsl:apply-templates select="../inputThree"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="inputThree">
    <xsl:copy>
        <xsl:copy-of select="numberThree"/>
        <xsl:apply-templates select="key('in4', generate-id())"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="inputFour">
    <xsl:copy>
        <xsl:copy-of select="numberFour"/>
        <xsl:apply-templates select="key('in5', generate-id())"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="inputFive">
    <xsl:copy>
        <xsl:copy-of select="numberFive"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

相关问题