xml文件的xsl实现

时间:2012-03-15 12:06:44

标签: xslt

需要转换具有带有属性(名称)的标记(dynamicVariable)的xml文件。必须使用xsl将此xml文件转换为相同的xml文件,以使标记(dynamicVariable)具有相同的结构使用它及其标签内容也应该是属性的值。

需要转换下面的xml文件

   <Content>
     <alertHeader>
         <text xmlns="http://abc.com" xmlns:w="http://def.com"> Claim  
           <dynamicVariable name="Claim_Reference" />: More Information Needed
         </text>
         <contactUs>false</contactUs>
     </alertHeader>


     <body>
         <text> ATM/Debit Card Claim: 
         <strong><dynamicVariable name="Claim_Reference" /></strong>
         </text>
     </body>

         </Content>

采用相同的格式,但具有'name'属性的标记应该以输出xml文件的形式显示为此格式

      <dynamicVariable name="Claim_Reference" />Claim_Reference</dynamicVariable>

任何人都可以在转换相同内容时提供必要的xsl文件。希望它完成使用

    <xsl:copy></xsl:copy>  or <xsl:copy-of /> tags .

2 个答案:

答案 0 :(得分:1)

就这么简单

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

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

     <xsl:template match="*[name() = 'dynamicVariable']">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:value-of select="@name"/>
      </xsl:copy>
     </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时

<Content>
    <alertHeader>
        <text xmlns="http://abc.com" xmlns:w="http://def.com"> Claim              
            <dynamicVariable name="Claim_Reference" />: More Information Needed          
        </text>
        <contactUs>false</contactUs>
    </alertHeader>
    <body>
        <text> ATM/Debit Card Claim:           
            <strong>
                <dynamicVariable name="Claim_Reference" />
            </strong>
        </text>
    </body>
</Content>

产生了想要的正确结果

<Content>
   <alertHeader>
      <text xmlns="http://abc.com" xmlns:w="http://def.com"> Claim
            <dynamicVariable name="Claim_Reference">Claim_Reference</dynamicVariable>: More Information Needed
        </text>
      <contactUs>false</contactUs>
   </alertHeader>
   <body>
      <text> ATM/Debit Card Claim:
            <strong>
            <dynamicVariable name="Claim_Reference">Claim_Reference</dynamicVariable>
         </strong>
      </text>
   </body>
</Content>

<强>解释

  1. identity rule “按原样”复制每个节点。

  2. 单个模板会覆盖标识模板。它匹配名称为“dynamicVariable”的任何名称“strong”而不管名称空间,并且它是dynamicVariable的子项(因此指定更多上下文有助于我们仅处理name的这种情况,但保留前面的内容一个“按原样”)。

  3. 重写tempalte shallo-复制当前节点,然后复制其属性,最后创建一个text-node子节点,其内容是当前(匹配)元素的{{1}}属性的字符串值

答案 1 :(得分:0)

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:t="http://abc.com">

  <xsl:output method="xml"/>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="dynamicVariable[@name]|t:dynamicVariable[@name]">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:value-of select="@name"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>