xsl:apply-templates returns nothing - 我错过了什么?

xsl:apply-templates returns nothing − what am I missing?

我有一个简单的 XML 回复,比如

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/">
    <numberOfRecords>1</numberOfRecords>
    <records>
        <record>
            <recordData>
                <kitodo xmlns="http://meta.kitodo.org/v1/">
                    <metadata name="key1">value1</metadata>
                    <metadata name="key2">value2</metadata>
                    <metadata name="key3">value3</metadata>
                </kitodo>
            </recordData>
        </record>
    </records>
</searchRetrieveResponse>

我想通过 XSLT 转换成这个

<?xml version="1.0" encoding="utf-8"?>
<mets:mdWrap xmlns:kitodo="http://meta.kitodo.org/v1/"
              xmlns:mets="http://www.loc.gov/METS/"
              xmlns:srw="http://www.loc.gov/zing/srw/"
              MDTYPE="OTHER"
              OTHERMDTYPE="Kitodo">
    <mets:xmlData>
        <kitodo:kitodo>
            <kitodo:metadata name="key1">value1</kitodo:metadata>
            <kitodo:metadata name="key2">value2</kitodo:metadata>
            <kitodo:metadata name="key3">value3</kitodo:metadata>
        </kitodo:kitodo>    
    </mets:xmlData>
</mets:mdWrap>

也就是说,我想删除外面的树searchRetrieveResponse/records/record/recordData,将其替换为mdWrap/xmlData并将包含的数据节点移到那里。 我有一个很短的 XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kitodo="http://meta.kitodo.org/v1/" xmlns:mets="http://www.loc.gov/METS/" xmlns:srw="http://www.loc.gov/zing/srw/">
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="srw:recordData">
        <mets:mdWrap MDTYPE="OTHER" OTHERMDTYPE="Kitodo">
            <mets:xmlData>
                <xsl:apply-templates select="@*|node()"/>
            </mets:xmlData>
        </mets:mdWrap>
    </xsl:template>

    <!-- pass-through rule -->
    <xsl:template match="@*|node()">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>
</xsl:stylesheet>

然而,我得到的是:

<?xml version="1.0" encoding="utf-8"?>
<mets:mdWrap xmlns:kitodo="http://meta.kitodo.org/v1/"
              xmlns:mets="http://www.loc.gov/METS/"
              xmlns:srw="http://www.loc.gov/zing/srw/"
              MDTYPE="OTHER"
              OTHERMDTYPE="Kitodo">
   <mets:xmlData/>
</mets:mdWrap>

显然,template match="srw:recordData" 确实 匹配,否则我会得到一个空结果。但是,包含的 apply-templates 不输出任何内容。 (我也试过 <xsl:apply-templates/> 没有 select="" 属性,但它也没有输出任何东西。)我错过了什么?

XSLT 处理器是 net.sf.saxon.TransformerFactoryImpl (Java)

我认为在 xmlData 中应用模板时不会发生任何事情。没有匹配后代节点的模板。

尝试使用 copy-of:

<xsl:template match="srw:recordData">
    <mets:mdWrap MDTYPE="OTHER" OTHERMDTYPE="Kitodo">
        <mets:xmlData>
            <xsl:copy-of select="kitodo:kitodo"/>                
        </mets:xmlData>
    </mets:mdWrap>
</xsl:template>

问题是不是 xsl:apply-templates 指令。它与正在应用的模板一起使用。您的“pass-through 规则”不会向输出写入任何内容。您可能打算在那个地方使用 identity transform 模板 - 如下所示:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>