首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于XML命名空间的原因,XSLT代码未运行

由于XML命名空间的原因,XSLT代码未运行
EN

Stack Overflow用户
提问于 2021-06-29 04:53:28
回答 2查看 50关注 0票数 1

我发现命名空间有问题,希望能得到您的帮助。

原始XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<SyncItemMaster   xmlns="http://schema.xxx.com/xxxOAGIS/2" >

  <ApplicationArea>
    <Sender>
      <LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
      <ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
      <ConfirmationCode>OnError</ConfirmationCode>
    </Sender>
    <CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
    <BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
  </ApplicationArea>
  <DataArea>
    <ItemMaster>
      <ItemMasterHeader>
        <Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
        <Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
        <Classification>
          <Codes>
            <Code listID="Item Groups" sequence="1">00006002</Code>
          </Codes>
        </Classification>
        <Classification>
          <Codes>
            <Code sequence="1" listID="Item Types">E01</Code>
          </Codes>
        </Classification>
        <UserArea>
          <Property>
            <NameValue name="Free1">679QB</NameValue>
          </Property>
          <Property>
            <NameValue name="Free2">0.00</NameValue>
          </Property>
        </UserArea>
      </ItemMasterHeader>
    </ItemMaster>
  </DataArea>
</SyncItemMaster>

XSLT是

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://schema.xxx.com/xxxOAGIS/2"   >
  <xsl:output method="xml" encoding="UTF-8" indent="no" byte-order-mark="no"/>
  <xsl:strip-space elements="*"/>
  <!-- Copy whole source doc. to target -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

 
  <xsl:template match="//*:ItemMasterHeader">
    <xsl:copy>
      <xsl:copy-of select="Description|Classification"/>
      <Classification>
        <Codes>
          <Code listID="RESPQQQ" sequence="1"></Code>
        </Codes>
      </Classification>

    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

我的结果是

代码语言:javascript
复制
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2">
  <ApplicationArea>
    <Sender>
      <LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
      <ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
      <ConfirmationCode>OnError</ConfirmationCode>
    </Sender>
    <CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
    <BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
  </ApplicationArea>
  <DataArea>
    <ItemMaster>
      <ItemMasterHeader>
        <Classification>
          <Codes>
            <Code listID="RESPQQQ" sequence="1"/>
          </Codes>
        </Classification>
      </ItemMasterHeader>
    </ItemMaster>
  </DataArea>
</SyncItemMaster>

这是不正确的,因为我的xslt是复制整个文档。指向并插入RESPQQQ元素。

下面是我所期望的xml。

代码语言:javascript
复制
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2">
  <ApplicationArea>
    <Sender>
      <LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
      <ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
      <ConfirmationCode>OnError</ConfirmationCode>
    </Sender>
    <CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
    <BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
  </ApplicationArea>
  <DataArea>
    <ItemMaster>
      <ItemMasterHeader>
        <Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
        <Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
        <Classification>
          <Codes>
            <Code listID="Item Groups" sequence="1">00006002</Code>
          </Codes>
        </Classification>
        <Classification>
          <Codes>
            <Code sequence="1" listID="Item Types">E01</Code>
          </Codes>
        </Classification>
        <Classification>
          <Codes>
            <Code listID="RESPQQQ" sequence="1"/>
          </Codes>
        </Classification>
        <UserArea>
          <Property>
            <NameValue name="Free1">679QB</NameValue>
          </Property>
          <Property>
            <NameValue name="Free2">0.00</NameValue>
          </Property>
        </UserArea>
      </ItemMasterHeader>
    </ItemMaster>
  </DataArea>
</SyncItemMaster>

因此,如何修复XSLT才能在XML中使用该名称空间呢?非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2021-06-29 06:42:24

实现这一点的一种方法是使用以下样式表:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:oagis="http://schema.xxx.com/xxxOAGIS/2"   >
  <xsl:output method="xml" encoding="UTF-8" indent="no" byte-order-mark="no"/>
  <xsl:strip-space elements="*"/>
  
  <!-- Copy whole source doc. to target -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="oagis:*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="node() | @*"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="oagis:UserArea">
    <xsl:element name="Classification" xmlns="http://schema.xxx.com/xxxOAGIS/2">
      <xsl:element name="Codes">
        <xsl:element name="Code">
          <xsl:attribute name="listID">RESPQQQ</xsl:attribute>
          <xsl:attribute name="sequence">1</xsl:attribute>
        </xsl:element>
      </xsl:element>
    </xsl:element>
  </xsl:template>
  
</xsl:stylesheet>

它的输出是

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<SyncItemMaster>
    <ApplicationArea>
        <Sender>
            <LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
            <ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
            <ConfirmationCode>OnError</ConfirmationCode>
        </Sender>
        <CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
        <BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
    </ApplicationArea>
    <DataArea>
        <ItemMaster>
            <ItemMasterHeader>
                <Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
                <Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
                <Classification>
                    <Codes>
                        <Code listID="Item Groups" sequence="1">00006002</Code>
                    </Codes>
                </Classification>
                <Classification>
                    <Codes>
                        <Code sequence="1" listID="Item Types">E01</Code>
                    </Codes>
                </Classification>
                <Classification xmlns="http://schema.xxx.com/xxxOAGIS/2">
                    <Codes>
                        <Code listID="RESPQQQ" sequence="1"/>
                    </Codes>
                </Classification>
            </ItemMasterHeader>
        </ItemMaster>
    </DataArea>
</SyncItemMaster>

这应该和预期的一样。

票数 1
EN

Stack Overflow用户

发布于 2021-06-29 08:13:08

我怀疑你真的想做这样的事情:

XSLT2.0

代码语言:javascript
复制
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://schema.xxx.com/xxxOAGIS/2"
xmlns="http://schema.xxx.com/xxxOAGIS/2" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="ItemMasterHeader">
    <xsl:copy>
        <xsl:copy-of select="Description|Classification"/>
        <Classification>
            <Codes>
                <Code listID="RESPQQQ" sequence="1"/>
            </Codes>
        </Classification>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这将保留所有复制的元素在其原始名称空间中,并将添加的Classification元素放在相同的名称空间中-因此结果为:

结果

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<SyncItemMaster xmlns="http://schema.xxx.com/xxxOAGIS/2">
   <ApplicationArea>
      <Sender>
         <LogicalID schemeVersionID="16.0.0.051">lid://in.m4.m4</LogicalID>
         <ComponentID schemeVersionID="16.0.0.20210322170049">M4BEX</ComponentID>
         <ConfirmationCode>OnError</ConfirmationCode>
      </Sender>
      <CreationDateTime>2021-06-17T18:42:31.420Z</CreationDateTime>
      <BODID>e99a31bc-4ad5-45e1-a27b-10b27b9511c6</BODID>
   </ApplicationArea>
   <DataArea>
      <ItemMaster>
         <ItemMasterHeader>
            <Description>JADE COLL 5-5/8 X 48 W/PAD</Description>
            <Description type="ShortName">4MM GEMCORE ARCTIC 12MIL</Description>
            <Classification>
               <Codes>
                  <Code listID="Item Groups" sequence="1">00006002</Code>
               </Codes>
            </Classification>
            <Classification>
               <Codes>
                  <Code sequence="1" listID="Item Types">E01</Code>
               </Codes>
            </Classification>
            <Classification>
               <Codes>
                  <Code listID="RESPQQQ" sequence="1"/>
               </Codes>
            </Classification>
         </ItemMasterHeader>
      </ItemMaster>
   </DataArea>
</SyncItemMaster>

注意,UserArea元素并没有被复制;我不确定这是您真正想要的,还是只是您的一个遗漏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68169910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档