首页 > 解决方案 > XML - XSLT - 保留输入 XML 文档的一部分

问题描述

我有这个输入 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<jasperPrint xmlns="http://jasperreports.sourceforge.net/jasperreports/print"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/print http://jasperreports.sourceforge.net/xsd/jasperprint.xsd">
<page>
    <firstElement>Some Data</firstElement>
    <secondElement name="2ndElement">
        <subElement id="1SE">
            <firstChild name="1st"/>
            <secondChild>DATA I WANT TO KEEP 1</secondChild>
        </subElement>   
        <subElement id="1SE">
            <firstChild name="1st"/>
            <secondChild>DATA I WANT TO KEEP 2</secondChild>
        </subElement>   
        <subElement id="1SE">
            <firstChild name="1st"/>
            <secondChild>DATA I WANT TO KEEP 3</secondChild>
        </subElement>   
        <subElement id="1SE">
            <firstChild name="1st"/>
            <secondChild>DATA I WANT TO KEEP 4</secondChild>
        </subElement>   
    </secondElement>
</page>
</jasperPrint>

使用 XSLT,我想对其进行转换,以便只保留<secondChild>元素,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<secondChildList>
    <secondChild>DATA I WANT TO KEEP 1</secondChild>
    <secondChild>DATA I WANT TO KEEP 2</secondChild>
    <secondChild>DATA I WANT TO KEEP 3</secondChild>
    <secondChild>DATA I WANT TO KEEP 4</secondChild>
</secondChildList>

这是我正在尝试的 XSLT 代码:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://jasperreports.sourceforge.net/jasperreports/print"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/print http://jasperreports.sourceforge.net/xsd/jasperprint.xsd">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>



<xsl:template match="jasperPrint/page/secondElement">

    <secondChildList>

        <xsl:for-each select="subElement">
             <secondChild>
                 <xsl:value-of select="secondChild"/>
            </secondChild>
        </xsl:for-each>

    </secondChildList>

</xsl:template>


</xsl:stylesheet>

这只是输出输入 XML 文档中的文本,如下所示:

<?xml version="1.0" encoding="UTF-8"?>Some DataDATA I WANT TO KEEP 1DATA I WANT TO KEEP 2DATA I WANT TO KEEP 3DATA I WANT TO KEEP 4

如何使用 XSLT 实现我想要的输出 XML 文档?

谢谢!

亚历山大·哈辛托

标签: xmlxsltsaxonxslt-3.0

解决方案


实现这一点的最简单的样式表可能是:

<secondChildList xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:copy-of select="//secondChild"/>
</secondChildList>

试试看。没有包装器的简化样式表xsl:stylesheet对于像这样的简单工作非常方便。但是如果你想添加类似 xsl:output 的东西,那么你需要完整的语法:

<xsl:stylesheet xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
    <secondChildList>
      <xsl:copy-of select="//secondChild"/>
    </secondChildList>
</xsl:template>

</xsl:stylesheet>

推荐阅读