如何使用xslt将值附加到xml

时间:2015-10-15 17:05:12

标签: xml xslt

这是xml:

<?xml version="1.0" encoding="UTF-8"?>
<Posttype1 xmlns="http://www.company.com/path" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <type1Set>
    <type1 action="Add">
      <CLASS maxvalue="type1">type1</CLASS>
      <CREATEDBY>user</CREATEDBY>
      <LANGCODE>EN</LANGCODE>
      <STATUS>NEW</STATUS>
      <ID>1073</ID>
    </type1>
  </type1Set>
</Posttype1>

在此xml中,Posttype1必须转换为Puttype1,ID值必须附加99。 输出应为

<?xml version="1.0" encoding="UTF-8"?>
<Puttype1 xmlns="http://www.company.com/path" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <type1Set>
    <type1 action="Add">
      <CLASS maxvalue="type1">type1</CLASS>
      <CREATEDBY>user</CREATEDBY>
      <LANGCODE>EN</LANGCODE>
      <STATUS>NEW</STATUS>
      <ID>991073</ID>
    </type1>
  </type1Set>
</Posttype1>

使用xslt转换Posttype1,但在尝试追加99时,我无法达到Id。

使用的XSLT是

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:comp="http://www.company.com/path" version="1.0" >
<xsl:template match="comp:Postype1 ">
    <xsl:element name="Puttype1 ">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Puttype1/type1Set/type1/ID">
<xsl:number>99</xsl:number>
</xsl:template>
</xsl:stylesheet> 

这给出了以下输出

 <?xml version="1.0" encoding="UTF-8"?>
 <Puttype1 >
  <type1Set xmlns="http://www.company.com/path" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <type1 action="Add">
      <CLASS maxvalue="type1">type1</CLASS>
      <CREATEDBY>user</CREATEDBY>
      <LANGCODE>EN</LANGCODE>
<STATUS>NEW</STATUS>
   <ID>1073</ID>
   </type1>
   </type1Set>
   </Posttype1>

正如你可以看到xmlns和xmlns:xsi正在转移到子标记,有人可以告诉我为什么会这样,我不知道如何附加整数。

P.S。我也试过

<xsl:template match="comp:Postype1 ">
<xsl:element name="Puttype1 ">
    <xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>

它将xmlns标记移动到父级,但xmlns:xsi仍然是子级。

1 个答案:

答案 0 :(得分:1)

怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:comp="http://www.company.com/path">
<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="comp:Postype1 ">
    <Puttype1 xmlns="http://www.company.com/path">
        <xsl:apply-templates select="@*|node()"/>
    </Puttype1>
</xsl:template>

<xsl:template match="comp:ID">
    <xsl:copy>
        <xsl:value-of select="concat('99', . )"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>