【问题标题】:XSLT not matching - namespace tempuri.org CryptoXSLT 不匹配 - 命名空间 tempuri.org 加密
【发布时间】:2016-02-29 12:22:14
【问题描述】:

非常感谢您的帮助!

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

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

删除了正确输出的命名空间的 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 xslt namespaces cryptography xml-namespaces


    【解决方案1】:

    当您的 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>
    

    【讨论】:

    • 非常感谢。这个问题让我很头疼!
    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多