非常感谢!
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>
谢谢!
答案 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>