我有一个XML,我需要使用XSLT进行转换。 XML有自定义标记,但没有得到解决,我没有得到结果。
以下是XML代码:
<?xml version="1.0" encoding="UTF-16"?>
<di:itg_dataImport xmlns:di="http://www.mercury.com/itg/data_import/1.0"
xmlns = "http://www.mercury.com/itg/dm/2.0/types"
xmlns:common = "http://www.mercury.com/itg/common/2.0/types"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd">
<request>
<requestType>Project Issue</requestType>
<identifier>3</identifier>
<common:simpleField>
<common:token>REQ.ASSIGNED_TO_USER_ID</common:token>
<common:stringValue>Admin User (DEV)</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.DESCRIPTION</common:token>
<common:stringValue>Test - Pls Ignore</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.KNTA_ESCALATION_LEVEL</common:token>
<common:stringValue>Project</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.KNTA_MASTER_PROJ_REF</common:token>
<common:stringValue>P0912002 IPTV Residential Phase 1</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.PRIORITY_CODE</common:token>
<common:stringValue>Normal</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.WORKFLOW_ID</common:token>
<common:stringValue>Issue Management Process</common:stringValue>
</common:simpleField>
</request>
</di:itg_dataImport>
以下是被调用的XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:di="http://www.mercury.com/itg/data_import/1.0"
xmlns = "http://www.mercury.com/itg/dm/2.0/types"
xmlns:common = "http://www.mercury.com/itg/common/2.0/types"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<requests>
<request>
<requestType>
<xsl:copy-of select="di:itg_dataImport/request/requestType"/>
</requestType>
</request>
</requests>
</xsl:template>
</xsl:stylesheet>
所需的输出是:
项目问题
任何人都可以帮助解决和指出我出错的地方。 感谢
答案 0 :(得分:1)
XSL文件:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:di="http://www.mercury.com/itg/data_import/1.0"
xmlns = "http://www.mercury.com/itg/dm/2.0/types"
xmlns:common = "http://www.mercury.com/itg/common/2.0/types"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<requests>
<request>
<xsl:for-each select="descendant::*[local-name() = 'requestType']">
<requestType>
<xsl:value-of select="text()"/>
</requestType>
</xsl:for-each>
</request>
</requests>
</xsl:template>
</xsl:stylesheet>
<强>结果-文献强>
<?xml version="1.0" encoding="utf-8"?>
<requests xmlns="http://www.mercury.com/itg/dm/2.0/types" xmlns:di="http://www.mercury.com/itg/data_import/1.0" xmlns:common="http://www.mercury.com/itg/common/2.0/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<request>
<requestType>Project Issue</requestType>
</request>
</requests>
答案 1 :(得分:1)
这是头号XSLT编码错误:您的元素位于(默认)命名空间中,并且在选择它们时没有指定命名空间。
答案 2 :(得分:1)
为了使Michael Kay正确指出更明确的内容,以下是如何使用默认命名空间中的文档 - 在您的特定情况下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:di="http://www.mercury.com/itg/data_import/1.0"
xmlns:x = "http://www.mercury.com/itg/dm/2.0/types"
xmlns:common = "http://www.mercury.com/itg/common/2.0/types"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<requests>
<request>
<requestType>
<xsl:copy-of select="di:itg_dataImport/x:request/x:requestType"/>
</requestType>
</request>
</requests>
</xsl:template>
</xsl:stylesheet>
我对原始代码进行了一些简短的更改:
XSLT样式表不再具有默认命名空间 - 而是使用前缀指定相同的命名空间。
select
的{{1}}属性现在以所有名称为前缀。
在提供的XML文档上应用此转换时:
xsl:copy-of
产生了想要的正确结果:
<di:itg_dataImport xmlns:di="http://www.mercury.com/itg/data_import/1.0"
xmlns = "http://www.mercury.com/itg/dm/2.0/types"
xmlns:common = "http://www.mercury.com/itg/common/2.0/types"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd">
<request>
<requestType>Project Issue</requestType>
<identifier>3</identifier>
<common:simpleField>
<common:token>REQ.ASSIGNED_TO_USER_ID</common:token>
<common:stringValue>Admin User (DEV)</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.DESCRIPTION</common:token>
<common:stringValue>Test - Pls Ignore</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.KNTA_ESCALATION_LEVEL</common:token>
<common:stringValue>Project</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.KNTA_MASTER_PROJ_REF</common:token>
<common:stringValue>P0912002 IPTV Residential Phase 1</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.PRIORITY_CODE</common:token>
<common:stringValue>Normal</common:stringValue>
</common:simpleField>
<common:simpleField>
<common:token>REQ.WORKFLOW_ID</common:token>
<common:stringValue>Issue Management Process</common:stringValue>
</common:simpleField>
</request>
</di:itg_dataImport>
要记住的规则:XPath将未加前缀的名称视为属于“无名称空间”。为了解决这个问题,请在XSLT代码中定义此命名空间,但是使用前缀 - 然后使用此前缀为名称添加前缀。