使用 XSL 将 XML 转换为 HTMl 时遗漏值

Missed values while transforming XML into HTMl using XSL

我的 XML 文件的某些值在转换时未显示。看起来 XSL 名称空间有些不对,但我想不通。

XML 要转换的文件

<?xml-stylesheet type="text/xsl" href="birth_new_3.xsl"?>
<ns2:ROGDINFResponse xmlns="urn://x-artefacts-zags-rogdinf/types/4.0.1"
                     xmlns:ns2="urn://x-artefacts-zags-rogdinf/root/112-51/4.0.1">
    <ns2:ZgsAnswer>
        <ns2:BrthReg>
            <ns2:BrthLcs>
                <SerLcs>II-LP</SerLcs>
                <NumLcs>443334</NumLcs>
                <DateLcs>1988-03-18</DateLcs>
            </ns2:BrthLcs>
            <ns2:SvReg>
                <ns2:SvRodiv>
                    <ns2:FIOrogd>
                        <Last>Last</Last>
                        <First>Fname</First>
                        <Middle>Mname</Middle>
                    </ns2:FIOrogd>
                    <ns2:BirthDate>1988-01-19</ns2:BirthDate>
                    <ns2:BirthPlace Place="Some place"/>
                </ns2:SvRodiv>
            </ns2:SvReg>
        </ns2:BrthReg>
    </ns2:ZgsAnswer>
</ns2:ROGDINFResponse>

XSL 文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns2="urn://x-artefacts-zags-rogdinf/root/112-51/4.0.1"
                xmlns="urn://x-artefacts-zags-rogdinf/types/4.0.1">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <HTML>
            <BODY>
                <H2>Birth data</H2>
                <span>Serial: <b>
                        <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:BrthLcs/SerLcs"/>
                    </b>
                </span>
                <p>             
                <span>Number: <b>
                        <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:BrthLcs/NumLcs"/>
                    </b>
                </span>
                </p>
                <p>
                <span>Date: <b>
                        <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:BrthLcs/DateLcs"/>
                    </b>
                </span> 
                </p>
                <H3>Additional data: </H3>
                <span>Last, First, Middle:
                            <b>
                                <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:FIOrogd/Last"/>
                            </b>
                            <b>
                                <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:FIOrogd/First"/>
                            </b>
                            <b>
                                <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:FIOrogd/Middle"/>
                            </b>
                </span>
                <p>
                <span>Date: <b>
                        <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:BirthDate"/>
                    </b>
                </span>
                </p>
                <p>
                <span>Place: <b>
                        <xsl:apply-templates select="//ns2:ROGDINFResponse/ns2:ZgsAnswer/ns2:BrthReg/ns2:SvReg/ns2:SvRodiv/ns2:BirthPlace/@Place"/>
                    </b>
                </span>
                </p>
            </BODY>
        </HTML>
    </xsl:template>
</xsl:stylesheet>

我的 XML 的一些值显示得很好,但是没有命名空间的字段的值没有显示(SerLcs、NumLcs、DateLcs、Last、First、Middle)。 我该如何修复我的 XSL?

而不是 XSLT 中的 xmlns="urn://x-artefacts-zags-rogdinf/types/4.0.1" 你想要 xpath-default-namespace="urn://x-artefacts-zags-rogdinf/types/4.0.1" 在那里。请注意,这仅适用于 XSLT 2 和 3 处理器,如 Saxon 9 或 10、Saxon-JS 2、XmlPrime、Exselt、AltovaXML。

First、Last 和 Middle 确实有一个命名空间:它们在命名空间 urn://x-artefacts-zags-rogdinf/types/4.0.1 中。在 XPath 中,默认情况下,不带前缀的名称指的是不在命名空间中的元素。您可以按照@MartinHonnen 的建议使用 xpath-default-namespace 更改它。