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

时间:2016-02-29 12:22:14

标签: xml xslt namespaces cryptography xml-namespaces

非常感谢!

Crypto是法国房地产XML规范。我正在使用1个记录测试XML文件。

当我从XML输入文件中删除Crypto XMLNS声明时,有人能告诉我为什么以下XSLT有效,但是当我包含它时却没有?

带有NAMESPACE的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 WITH WORKING 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>

谢谢!

1 个答案:

答案 0 :(得分:0)

如果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>