自定义标记在XSLT转换中不起作用

时间:2012-05-09 03:44:23

标签: xml xslt

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

所需的输出是:

项目问题

任何人都可以帮助解决和指出我出错的地方。 感谢

3 个答案:

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

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

  1. XSLT样式表不再具有默认命名空间 - 而是使用前缀指定相同的命名空间。

  2. select的{​​{1}}属性现在以所有名称为前缀。

  3. 在提供的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代码中定义此命名空间,但是使用前缀 - 然后使用此前缀为名称添加前缀。