2

XSLTを使用して秘密にする必要のあるXMLがあります。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: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属性に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 に答える
1

これは XSLT コーディングの最大の誤りです。要素が (デフォルトの) 名前空間にあり、要素を選択するときに名前空間を指定していません。

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