XSLT 不匹配 - 命名空间 tempuri.org 加密

XSLT not matching - namespace tempuri.org Crypto

非常感谢帮助!

Crypto 是法国房地产 XML 规范。我正在处理 1 条记录,测试 XML 文件。

谁能告诉我为什么以下 XSLT 在我从 XML 输入文件中删除 Crypto XMLNS 声明时有效,但在我包含它时却不起作用?

XML 删除了正确输出的命名空间

<?xml version="1.0" encoding="UTF-8"?>
<ROOT xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/CryptML.xsd">  
    <DESTINATAIRE>    
        <AGENCE>      
            <BIEN>
                <REFERENCE>43</REFERENCE>        
            </BIEN>      
        </AGENCE>
    </DESTINATAIRE>
</ROOT>

XML 工作 XML

<?xml version="1.0" encoding="UTF-8"?>
<ROOT xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
    <DESTINATAIRE>    
        <AGENCE>      
            <BIEN>
                <REFERENCE>43</REFERENCE>        
            </BIEN>      
        </AGENCE>
    </DESTINATAIRE>
</ROOT>

XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <xsl:for-each select="ROOT/DESTINATAIRE/AGENCE/BIEN"> 
        <COL><DATA><xsl:text>This is a test</xsl:text></DATA></COL>
    </xsl:for-each>
</xsl:template>  

预期结果

<?xml version="1.0" encoding="UTF-8"?>
    <COL>
        <DATA>This is a test</DATA>
    </COL>

谢谢!

如果您的 XML 中有默认名称空间,则所有元素都属于该名称空间。这使得它们不同于不在命名空间中的元素,即使它们在 XML.

中具有相同的名称

您的 XSLT 没有引用命名空间。它正在寻找没有命名空间的元素,因此不会匹配属于命名空间的元素。

解决方案是在 XSLT 中声明命名空间,并使用它来匹配该命名空间中的元素

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl"
                              xmlns:cml="http://tempuri.org/CryptML.xsd">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <xsl:for-each select="cml:ROOT/cml:DESTINATAIRE/cml:AGENCE/cml:BIEN"> 
        <COL><DATA><xsl:text>This is a test</xsl:text></DATA></COL>
    </xsl:for-each>
</xsl:template>  
</xsl:stylesheet>

请注意,如果您可以使用 XSLT 2.0,则可以使用 "xpath-default-namespace" 属性,它允许将默认命名空间应用于 xpath 表达式,而无需显式设置前缀:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl"
 xpath-default-namespace="http://tempuri.org/CryptML.xsd">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <xsl:for-each select="ROOT/DESTINATAIRE/AGENCE/BIEN"> 
        <COL><DATA><xsl:text>This is a test</xsl:text></DATA></COL>
    </xsl:for-each>
</xsl:template>  
</xsl:stylesheet>