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>
非常感谢帮助!
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>