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

标签 xslt xpath namespaces prefix

我有这个有效负载,我感兴趣的是如何将这个“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>

最佳答案

这种转变:

<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>

关于xslt - 如何为有效负载 xsl 设置命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11884803/

相关文章:

xslt - xsl 模板匹配忽略命名空间

xml - XSLT 忽略多个文件中的重复元素

php - 将 php 变量添加到 Xpath

xml - <xsl :copy-of copying the namespace present in the root node . 如何避免这种情况?

xml - Dataweave:打开和关闭标签命名空间

html - 在 XSL 样式表中显示带有 .CSS 链接的 Bootstrap HTML?

xslt - 不能停止从程序方面考虑 XSLT... 帮助应用模板

perl - XPath Perl 获取属性值

python - 使用 Python (Selenium) 选择提交按钮

c - 为什么标准规定 C 中的结构、枚举和 union 标签有三种可能的 namespace ,而实际上只有一种?