【问题标题】:How to create xml start and end tag for empty tag without any space using xslt如何使用xslt为没有任何空格的空标签创建xml开始和结束标签
【发布时间】:2014-12-07 06:36:38
【问题描述】:

使用 xslt 为没有任何空格的空标签创建重复标签。
例如代码中的请求:

<?xml version = "1.0" encoding = "UTF-8"?>
<root>
    <Name>PJ</Name>
    <address/>
    <param/>
</root>

输出为:

<?xml version = "1.0" encoding = "UTF-8"?>
<root>
    <Name>PJ</Name>
    <address></address>
    <param></param>
</root>

【问题讨论】:

  • 客户使用的是旧系统,他们需要这种格式。
  • 我不知道这样做的好方法。从表面上看,您可以将输出方法设置为 HTML - 但您的处理器很可能根本不会关闭 标记。 “坏”的方式会将标签输出为文本,我真的不建议这样做。
  • @roushan 这就是为什么从不适合用除 XML 解析器之外的任何东西来解析 XML 的原因。您的客户犯了这个错误,现在您必须解决他们的愚蠢问题。

标签: xslt xslt-1.0


【解决方案1】:

正如我在 cmets 中所说,我不能真正推荐这个,但如果一切都失败了,请尝试在您的样式表中包含以下模板:

<xsl:template match="*[not(* or text())]">
    <xsl:variable name="name" select="local-name()"/>
    <xsl:value-of select="concat('&lt;', $name, '&gt;&lt;/', $name, '&gt;')" disable-output-escaping="yes"/>
</xsl:template>

请注意,这不会复制命名空间或属性。

【讨论】:

  • 这将输出作为 PJ
    但这里缺少具有值的字段
  • 好吧,您当然是:您需要将其添加到您现有的样式表(您尚未向我们展示)。
  • 我正在创建一个新的 xslt,正如你所说:
  • 请不要在 cmets 中发布代码。我以为你已经有了一个样式表。如果没有,请创建一个并包含identity transform template 和上面的模板。
【解决方案2】:

让您的 XSLT 发挥作用,不要试图弯曲它(1)

获取它生成的 XML 文件并进行正则表达式替换(2)&lt;([^/\s]+)\s*/&gt;&lt;\1&gt;&lt;/\1&gt;


(1) 试图弯曲它只会无缘无故地产生极其丑陋的 XSLT。

(2) 确保打开 XML 文件并将其保存在它所在的编码中,在您的情况下为 UTF-8

【讨论】:

  • 我不明白你的替换功能。你能详细说明一下吗?
  • 采用您选择的编程/脚本语言,编写一个三行脚本,以文本形式打开 XML 文件,执行正则表达式搜索和替换操作并再次保存。或者,扩展运行 XSLT 转换的程序。我认为这很明显。
  • @roushan 顺便说一句,请不要在 StackOverflow 上使用像“u plz”这样的聊天语言。我们有足够的时间在这里正确拼出单词。
【解决方案3】:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<!-- <xsl:variable name="name" select="local-name()"/> -->
    <xsl:value-of select="concat('&lt;', local-name(), '&gt;&lt;/', local-name(), '&gt;')" disable-output-escaping="yes"/>
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="text() | processing-instruction() | comment()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多