如何将命名空间前缀设置为有效负载 xsl

Posted

技术标签:

【中文标题】如何将命名空间前缀设置为有效负载 xsl【英文标题】:How to set a namespace prefix to a payload xsl 【发布时间】:2012-08-09 13:42:31 【问题描述】:

我有这个有效载荷,我很想知道如何将这个“TV:”命名空间前缀添加到其中的所有节点和元素。

<TVInqResponse>
         <TVInqRS>
            <StatusCode>0</StatusCode>
            <StatusDescription>Success</StatusDescription>

This is what is expect to have as a result:

<**tv**:TVInqResponse>
         <**tv**:TVInqRS>
            <**tv**:StatusCode>0</**tv**:StatusCode>
            <**tv**:StatusDescription>Success</**tv**:StatusDescription>

【问题讨论】:

【参考方案1】:

这种转变

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

 <xsl:template match="*">
  <xsl:element name="tv:name()" namespace="some:tv">
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name="name"><xsl:value-of select="."/></xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时(基于提供的格式错误的“playload”...):

<TVInqResponse>
 <TVInqRS>
  <StatusCode>0</StatusCode>
  <StatusDescription>Success</StatusDescription>
 </TVInqRS>
</TVInqResponse>

产生想要的正确结果

<tv:TVInqResponse xmlns:tv="some:tv">
   <tv:TVInqRS>
      <tv:StatusCode>0</tv:StatusCode>
      <tv:StatusDescription>Success</tv:StatusDescription>
   </tv:TVInqRS>
</tv:TVInqResponse>

如果您还希望任何属性名称在同一个命名空间中,请将模板匹配属性替换为这个

 <xsl:template match="@*">
  <xsl:attribute name="tv:name()" namespace="some:tv">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>

【讨论】:

以上是关于如何将命名空间前缀设置为有效负载 xsl的主要内容,如果未能解决你的问题,请参考以下文章

XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误

如何使用 XSLT 替换命名空间中的元素?

如何获取所有使用的命名空间的列表?

XSLT 将命名空间前缀添加到元素最佳实践

XSL:避免将命名空间定义导出到生成的 XML 文档

如何从输出 xml 中删除命名空间?