2

我有一个 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>

所需的输出是:

项目问题

任何人都可以帮助解决并指出我哪里出错了。谢谢

4

3 回答 3

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>
于 2012-05-09T04:29:35.763 回答
1

这是第一个 XSLT 编码错误:您的元素位于(默认)命名空间中,并且您在选择它们时没有指定命名空间。

于 2012-05-09T10:45:39.440 回答
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>

我只对您的原始代码进行了一些简短的更改

  1. XSLT 样式表不再有默认的命名空间——取而代之的是,它具有以前缀指定的相同命名空间。

  2. now的select属性以xsl:copy-of所有名称为前缀。

当此转换应用于提供的 XML 文档时

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

产生了想要的正确结果:

<requests 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">
    <request>
        <requestType>
            <requestType xmlns="http://www.mercury.com/itg/dm/2.0/types">Project Issue</requestType></requestType>
    </request>
</requests>

要记住的规则:XPath 将无前缀名称视为属于“无命名空间”。为了解决这个问题,在您的 XSLT 代码中定义这个名称空间,但是使用一个前缀 -- 然后使用这个前缀作为名称的前缀。

于 2012-05-09T12:41:12.893 回答