Xml XSLT转换不';t访问Islandora MODS到DC转换中没有文本内容的节点(其属性)

Xml XSLT转换不';t访问Islandora MODS到DC转换中没有文本内容的节点(其属性),xml,xslt,drupal,islandora,Xml,Xslt,Drupal,Islandora,我在Islandora(Drupal)工作,转换一些元数据(MOD到都柏林核心DC),并在XML上使用XSLT转换 XML如下所示: <mods:mods> <mods:extension> <mads:madsCollection> <mads:mads> ... <mads:topic lang="hrv" valueURI="

我在Islandora(Drupal)工作,转换一些元数据(MOD到都柏林核心DC),并在XML上使用XSLT转换

XML如下所示:

<mods:mods>
    <mods:extension>
        <mads:madsCollection>
            <mads:mads>
                ...
                <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D000349">Afrika</mads:topic>
                <mads:topic lang="eng">Africa</mads:topic>
                ...
            </mads:mads>
            <mads:mads>
                ...
                <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D005060">Europa</mads:topic>
                <mads:topic lang="eng">Europe</mads:topic>
                ...
            </mads:mads>
            <mads:mads>
                ...
                <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D001208" />
                <mads:topic lang="eng">Asia</mads:topic>
                ...
            </mads:mads>
            <mads:mads>
                ...
            <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D001315">Australia</mads:topic>
            <mads:topic lang="eng"/>
                ...
            </mads:mads>
        </mads:madsCollection>
    </mods:extension>
</mods:mods>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:mods="http://www.loc.gov/mods/v3" exclude-result-prefixes="mods"
                xmlns:dc="http://purl.org/dc/elements/1.1/"
                xmlns:mads="http://www.loc.gov/mads/v2"
                xmlns:srw_dc="info:srw/schema/1/dc-schema"
                xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="/">
        <!-- WS: updated schema location -->
        <xsl:for-each select="mods:mods">
            <oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
                <xsl:apply-templates/>
            </oai_dc:dc>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="/mods:mods/mods:extension/mads:madsCollection">
        <xsl:apply-templates select="mads:mads/mads:topic" />
    </xsl:template>

    <xsl:template match="mads:mads/mads:topic">
        <dc:subject>
            <xsl:attribute name="xml:lang">
                <xsl:value-of select="@lang" />
            </xsl:attribute>
            <xsl:value-of select="@valueURI" />
        </dc:subject>
    </xsl:template> 

</xsl:stylesheet>
<oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D000349</dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D005060</dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208</dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001315</dc:subject>
</oai_dc:dc>
为什么这个不见了

<dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208</dc:subject>
http://www.ncbi.nlm.nih.gov/mesh/D001208

好吧,我用XML测试了XSLT,结果很好。然而,为了完善结果,需要进行一次修改:

要仅选择包含
valueURI
属性的元素,必须添加谓词

<xsl:template match="/mods:mods/mods:extension/mads:madsCollection">
    <xsl:apply-templates select="mads:mads/mads:topic[@valueURI]" />
</xsl:template>

应用此修改后的结果是:

<?xml version="1.0" encoding="UTF-8"?><oai_dc:dc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:mads="http://www.loc.gov/mads/v2" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">

    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D000349 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D005060 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001315 </dc:subject>
</oai_dc:dc>

http://www.ncbi.nlm.nih.gov/mesh/D000349 
http://www.ncbi.nlm.nih.gov/mesh/D005060 
http://www.ncbi.nlm.nih.gov/mesh/D001208 
http://www.ncbi.nlm.nih.gov/mesh/D001315 

附言:我刚刚将您的输入XML放入XSLT处理器。输出符合您的要求。输出中没有缺少任何元素

您的问题是否显示了您遇到问题的确切XML?XSLT正在寻找一个名为
mods
(在
mods
名称空间中)的根元素,但这在XML中不存在。XML被缩减为有问题的部分,XSLT是完整的!我认为XML的其他部分没有问题,因为XSLT通常访问并输出它们。问题是在访问这个没有文本内容的兄弟姐妹时,我怀疑Islandora在转换之前杀死了其中一个模块中的元素,但我不知道确切的位置,很抱歉读到这个消息。我不知道
Islandora
或它的机构或组织使用它。我的回答只是确认您的输入XML由标准的conform XSLT处理器(在我的例子中是SaxonB)正确处理。如果XSLT处理器给出了不同的结果,那么可能是有缺陷的,因为Saxon基本上是标准的。
<?xml version="1.0" encoding="UTF-8"?><oai_dc:dc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:mads="http://www.loc.gov/mads/v2" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">

    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D000349 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D005060 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001315 </dc:subject>
</oai_dc:dc>