Identity Transformation - 比较属性和限制输出

Identity Transformation - compare attributes and limit output

我想比较两个 xml-Files 的属性并在同一步骤中对输入文件进行身份转换。输出 xml 应该只包含属性出现在比较 xml 中的元素。如给定的示例所示,不应输出最后一个概念节点,因为 comparing.xml

中没有匹配的属性

input.xml

<navigation 
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<facets>
    <facet id="d1e12000000000000000000000011111">
        <title xml:lang="en">sometxt</title>
        <title xml:lang="de">eintxt</title>
        <concepts>
            <concept id="d1e12000000000000000000000000000">
                <title xml:lang="en">sometxt</title>
                <title xml:lang="de">eintxt</title>
                <concepts>
                    <concept id="d1e19000000000000000000000000000">
                        <title xml:lang="en">sometxt</title>
                        <title xml:lang="de">eintxt</title>
                        <concepts>
                        </concepts>
                    </concept>
                </concepts>
            </concept>
        </concepts>
    </facet>
</facets>

部分 comparing.xml 不定 heading-levels

<foo>
<heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">Myheading</heading>
<chapter>
    <heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">myheading</heading>
    <operation>
        <heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">another heading</heading>
    </operation>
</chapter>

需要 output.xml,只有适用的 ID

<nav:navigation 
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nav="http://www.nav.de/">
<nav:facets>
    <nav:facet id="d1e12000000000000000000000011111">
        <nav:title xml:lang="en">sometxt</nav:title>
        <nav:title xml:lang="de">eintxt</nav:title>
        <nav:concepts>
            <nav:concept id="d1e12000000000000000000000000000">
                <nav:title xml:lang="en">sometxt</nav:title>
                <nav:title xml:lang="de">eintxt</nav:title>
                <nav:concepts>
                </nav:concepts>
            </nav:concept>
        </nav:concepts>
    </nav:facet>
</nav:facets>

我的xsl到目前为止

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:fo="http://www.w3.org/1999/XSL/Format"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:nav="http://www.nav.de/"
     version="2.0" >
        <xsl:output method="xml" indent="yes" encoding="utf-8"/>
        <xsl:variable name="docu" select="document(comparing.xml)"/>

        <xsl:template match="*">
            <xsl:element name="nav:{name()}" namespace="http://www.nav.de/">
                <xsl:copy-of select="namespace::*"/>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:element>
        </xsl:template>

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

编辑:很抱歉在 comment-section 中发布此内容。我已经按照这些思路尝试了一些方法,但没有用

   <xsl:template match="concept | facet">
        <xsl:variable name="foo-id" select="@id"/>  
        <xsl:for-each select="$docu//heading">
            <xsl:if test="contains(./@class, $foo-id)">
                <xsl:apply-templates/>  
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

我建议你这样试试:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:nav="http://www.nav.de/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="comparing-url" select="'comparing.xml'"/>

<xsl:key name="comp" match="@class" use="tokenize(., '\|')" />

<xsl:template match="*">
    <xsl:element name="nav:{name()}" >
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="*[@id][not(key('comp', @id, document($comparing-url)))]"/>

</xsl:stylesheet>