以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  [求助]如何在结果树中去掉命名空间和属性  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=56020)


--  作者:txnnh
--  发布时间:11/26/2007 1:34:00 PM

--  [求助]如何在结果树中去掉命名空间和属性
<?xml version="1.0" encoding="UTF-8"?>
<DOC xmlns:cops="http://www.cops.net/document">
 <cops:DeliveryInstruction>
  <cops:Channel>
   <cops:ServiceProvider>1</cops:ServiceProvider>
   <cops:Name>cops</cops:Name>
  </cops:Channel>
  <cops:From>
   <cops:ServiceProvider>1</cops:ServiceProvider>
   <cops:TradingPartner>aaaaaaa</cops:TradingPartner>
  </cops:From>
  <cops:To>
   <cops:ServiceProvider>1</cops:ServiceProvider>
   <cops:TradingPartner>bbbbbb</cops:TradingPartner>
  </cops:To>
 </cops:DeliveryInstruction>
 <cops:Header>
  <cops:FormURI>http://www.cops.net/form/1/aaaaaaa/po/1</cops:FormURI>
  <cops:Owner cops:id="efa6c181c0a802830097f6219d0e68b4">
   <cops:ServiceProvider>1</cops:ServiceProvider>
   <cops:TradingPartner>aaaaaaa</cops:TradingPartner>
  </cops:Owner>
  <cops:Originator cops:id="efa6c181c0a802830097f6219d0e68b4">
   <cops:ServiceProvider>1</cops:ServiceProvider>
   <cops:TradingPartner>aaaaaaa</cops:TradingPartner>
  </cops:Originator>
  <cops:Reference>aaaaaaa-po-20071123084027.176</cops:Reference>
  <cops:Version>1</cops:Version>
 </cops:Header>
 <DocType>850</DocType>
 <OrderStatus>21</OrderStatus>
 <OrderType>SA</OrderType>
 <POCDate/>
 <LIN id="1">
  <ItemID>10</ItemID>
  <ItemChange/>
  <LINOrderedQuantity>15</LINOrderedQuantity>
  <LINQuantityUOM>EA</LINQuantityUOM>
  <LINUnitPrice>1.2</LINUnitPrice>
  <LINRouting/>
 </LIN>
 <LIN id="2">
  <ItemID>20</ItemID>
  <ItemChange/>
  <LINOrderedQuantity>30</LINOrderedQuantity>
  <LINQuantityUOM>EA</LINQuantityUOM>
  <LINUnitPrice/>
  <LINRouting>Truck</LINRouting>
 </LIN>
</DOC>


我想要的输出结果是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<DOC>
 <DeliveryInstruction>
  <Channel>
   <ServiceProvider>1</ServiceProvider>
   <Name>cops</Name>
  </Channel>
  <From>
   <ServiceProvider>1</ServiceProvider>
   <TradingPartner>aaaaaaa</TradingPartner>
  </From>
  <To>
   <ServiceProvider>1</ServiceProvider>
   <TradingPartner>bbbbbb</TradingPartner>
  </To>
 </DeliveryInstruction>
 <Header>
  <FormURI>http://www.cops.net/form/1/aaaaaaa/po/1</FormURI>
  <Owner id="efa6c181c0a802830097f6219d0e68b4">
   <ServiceProvider>1</ServiceProvider>
   <TradingPartner>aaaaaaa</TradingPartner>
  </Owner>
  <Originator id="efa6c181c0a802830097f6219d0e68b4">
   <ServiceProvider>1</ServiceProvider>
   <TradingPartner>aaaaaaa</TradingPartner>
  </Originator>
  <Reference>aaaaaaa-po-20071123084027.176</Reference>
  <Version>1</Version>
 </Header>
 <DocType>850</DocType>
 <OrderStatus>21</OrderStatus>
 <OrderType>SA</OrderType>
 <POCDate></POCDate>
 <LIN>
  <ItemID>10</ItemID>
  <ItemChange></ItemChange>
  <LINOrderedQuantity>15</LINOrderedQuantity>
  <LINQuantityUOM>EA</LINQuantityUOM>
  <LINUnitPrice>1.2</LINUnitPrice>
  <LINRouting></LINRouting>
 </LIN>
 <LIN>
  <ItemID>20</ItemID>
  <ItemChange></ItemChange>
  <LINOrderedQuantity>30</LINOrderedQuantity>
  <LINQuantityUOM>EA</LINQuantityUOM>
  <LINUnitPrice></LINUnitPrice>
  <LINRouting>Truck</LINRouting>
 </LIN>
</DOC>

也就是说,要去掉所以的 命名空间前缀和属性 ,再有就是如果某个结点为空,不能是
以<AAAA/>表示,要用:<AAAA></AAAA>

要怎么设置换器呀?


--  作者:txnnh
--  发布时间:11/26/2007 4:29:00 PM

--  
笨的方法:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cops="http://www.cops.net/document">
 <xsl:output method="text"/>
 <xsl:template match="/">
  <xsl:apply-templates select="DOC" mode="AAAAA"/>
 </xsl:template>
 <xsl:template match="DOC" mode="AAAAA">
  <xsl:text>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</xsl:text>
  <xsl:text>&lt;DOC&gt;</xsl:text>
  <xsl:for-each select="node()[name() ='cops:DeliveryInstruction']">
   <xsl:text>&lt;</xsl:text>
   <xsl:value-of select="substring-after(name(),':')"/>
   <xsl:text>&gt;</xsl:text>
   <xsl:call-template name="writeChildNode"/>
   <xsl:text>&lt;/</xsl:text>
   <xsl:value-of select="substring-after(name(),':')"/>
   <xsl:text>&gt;</xsl:text>
  </xsl:for-each>
  <xsl:for-each select="node()[name() ='cops:Header']">
   <xsl:text>&lt;</xsl:text>
   <xsl:value-of select="substring-after(name(),':')"/>
   <xsl:text>&gt;</xsl:text>
   <xsl:call-template name="writeChildNode"/>
   <xsl:text>&lt;/</xsl:text>
   <xsl:value-of select="substring-after(name(),':')"/>
   <xsl:text>&gt;</xsl:text>
  </xsl:for-each>
  <xsl:for-each select="node()[name() !='cops:DeliveryInstruction' and name() !='cops:Header' and name() !='LIN'">
   <xsl:text>&lt;</xsl:text>
  <xsl:value-of select="name()"/>
   <xsl:text>&gt;</xsl:text>
   <xsl:value-of select="."/>
   <xsl:text>&lt;/</xsl:text>
   <xsl:value-of select="name()"/>
   <xsl:text>&gt;</xsl:text>
  </xsl:for-each>
  <xsl:for-each select="node()[name() ='LIN']">
   <xsl:text>&lt;</xsl:text>
   <xsl:value-of select="name()"/>
   <xsl:text>&gt;</xsl:text>
   <xsl:call-template name="writeNoNameSpacePrefixNode"/>
   <xsl:text>&lt;/</xsl:text>
   <xsl:value-of select="name()"/>
   <xsl:text>&gt;</xsl:text>
  </xsl:for-each>
    </xsl:for-each>
  <xsl:text>&lt;/DOC&gt;</xsl:text>
 </xsl:template>
 <xsl:template name="writeNoNameSpacePrefixNode">
  <xsl:for-each select="node()">
   <xsl:text>&lt;</xsl:text>
   <xsl:value-of select="name()"/>
   <xsl:text>&gt;</xsl:text>
   <xsl:choose>
    <xsl:when test="count(child::*) &gt; 0">
     <xsl:call-template name="writeNoNameSpacePrefixNode"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="."/>
    </xsl:otherwise>
   </xsl:choose>
   <xsl:text>&lt;/</xsl:text>
   <xsl:value-of select="name()"/>
   <xsl:text>&gt;</xsl:text>
  </xsl:for-each>
 </xsl:template>
 <xsl:template name="writeChildNode">
  <xsl:for-each select="node()">
   <xsl:text>&lt;</xsl:text>
   <xsl:value-of select="substring-after(name(),':')"/>
   <xsl:text>&gt;</xsl:text>
   <xsl:choose>
    <xsl:when test="count(child::*) &gt; 0">
     <xsl:call-template name="writeChildNode"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="."/>
    </xsl:otherwise>
   </xsl:choose>
   <xsl:text>&lt;/</xsl:text>
   <xsl:value-of select="substring-after(name(),':')"/>
   <xsl:text>&gt;</xsl:text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

[此贴子已经被作者于2007-11-26 16:59:31编辑过]

--  作者:txnnh
--  发布时间:11/26/2007 5:14:00 PM

--  
有没有高人知道在 xsl(t) 里怎么设一个属性什么的,  可以让转换后所有形如:
<AAAAA/>  变成 <AAAAA></AAAAA>
--  作者:Qr
--  发布时间:11/26/2007 5:18:00 PM

--  
以下是引用txnnh在2007-11-26 17:14:00的发言:
有没有高人知道在 xsl(t) 里怎么设一个属性什么的,  可以让转换后所有形如:
<AAAAA/>  变成 <AAAAA></AAAAA>


XSL中没有此功能吧。
MSXML 等大多数DOM解析器似乎不行,但也不定,有些版本的解析器则可以。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms