使用XSLT重命名XML标记的最佳方法

时间:2015-03-11 10:43:52

标签: xml xslt

这是我的XML文件:

  <?xml version="1.0" encoding="utf-8"?>
<consentException fpmlVersion="5-6" >
    <header>
        <messageId messageIdScheme="www.test.com">LH_msf_id</messageId>
        <inReplyTo messageIdScheme="">2424234243</inReplyTo><!-- message Id of entering party  -->
        <sentBy>test</sentBy>
        <sendTo>SEF1</sendTo>
        <creationTimestamp>2010-09-09T10:00:00-00:00</creationTimestamp>
    </header>
    <correlationId correlationIdScheme="">SEF_correlationId</correlationId>
    <reason>
        <reasonCode>3500001</reasonCode>
        <description>Invalid Currency ABC</description>
    </reason>
    <reason>
        <reasonCode>3500043</reasonCode>
        <description>Organization XYZ is not defined</description>
    </reason>
</consentException>

这是我的XSLT文件:

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

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

<xsl:template match="consentException/header/sentBy"> 
  <Hello><xsl:apply-templates select="@*|node()"/></Hello>
</xsl:template>

</xsl:stylesheet>

现在,XSLT代码替换了xml文件中的标记:( Hello标记)

<?xml version="1.0" encoding="UTF-8"?><consentException fpmlVersion="5-6">
    <header>
        <messageId messageIdScheme="www.test.com/">LH_msf_id</messageId>
        <inReplyTo messageIdScheme="">2424234243</inReplyTo><!-- message Id of entering party  -->
        <Hello>Test</Hello>
        <sendTo>SEF1</sendTo>
        <creationTimestamp>2010-09-09T10:00:00-00:00</creationTimestamp>
    </header>
    <correlationId correlationIdScheme="">SEF_correlationId</correlationId>
    <reason>
        <reasonCode>3500001</reasonCode>
        <description>Invalid Currency ABC</description>
    </reason>
    <reason>
        <reasonCode>3500043</reasonCode>
        <description>Organization XYZ is not defined</description>
    </reason>
</consentException>

但是,如果我想要替换XML文件中的所有标记,而不是指定每个标记,那么有更好的方法吗?

我不确定这一点但是如果有一个包含XML标签的文件以及必须替换哪些XML标签,是否可以通过某种方式使用XSLT代码引用该文件?

我正在努力寻找完成此任务的最佳方式 注意:标记替换只能用XSLT代码完成

更新

以下是最终的XML应该是什么样的:

<?xml version="1.0" encoding="utf-8"?>
<consentException fpmlVersion="5-6" >
    <header>
        <FPHdMsgID FPHdMsgIDScheme="www.test.com">LH_msf_id</FPHdMsgID>
        <inReplyTo messageIdScheme="">2424234243</inReplyTo><!-- message Id of entering party  -->
        <FPHdSentBy>Traiana</FPHdSentBy>
        <FPHdSentTo>SEF1</FPHdSentTo>
        <FPHdCreateTime>2010-09-09T10:00:00-00:00</FPHdCreateTime>
    </header>
    <FPCorID FPCorIDSch="">SEF_correlationId</FPCorID>
    <reason>
        <FPRsnCode>3500001</FPRsnCode>
        <FPRsnDesc>Invalid Currency ABC</FPRsnDesc>
    </reason>
    <reason>
        <FPRsnCode>3500043</FPRsnCode>
        <description>Organization XYZ is not defined</description>
    </reason>
</consentException>

2 个答案:

答案 0 :(得分:0)

  

如果存在包含XML标记的文件以及XML标记具有的内容   要替换,可以通过某种方式引用文件   XSLT代码?

是的,但肯定是完成此任务的最佳方式&#34;因为它会引入一个不必要的(而且相当昂贵的)步骤。如果您不得不不时更改重命名映射,并且不想在此过程中修改主XSLT文档,那么可能是一个很好的方法。否则,每个重命名最好都有一个模板。 XSLT自然是冗长的,习惯了它。

答案 1 :(得分:0)

像这样定义映射文件:

renaming.xml

<rename>
  <rename old="foo" new="bar"/>
  <rename old="fox" new="box"/>
</rename>

然后写一个元样式表&#39;像这样:

<xsl:namespace-alias stylesheet-prefix='a' result-prefix="xsl"/>
<xsl:template match="rename">
  <a:template match="{@old}">
    <a:element name="{@new}">
      <a:copy-of select="@*"/>
      <a:apply-templates/>
    </a:element>
  </a:template>
</xsl:template>

针对rename.xml运行此元样式表,并生成一个XSLT样式表,每个元素名称有一个模板规则,可以针对任何源文档运行并执行重命名。

我当然留下了一些细节,比如处理名称不在重命名文件中的元素,或处理名称空间。但任务很简单。