根据节点名称插入选项卡和 CR/LF

Posted

技术标签:

【中文标题】根据节点名称插入选项卡和 CR/LF【英文标题】:insert tab and CR/LF based on the node name 【发布时间】:2017-07-12 09:49:41 【问题描述】:

我有一个包含运动结果的 XML 文件,但需要对它们进行格式化和组织以便更好地阅读/理解,我认为格式化应该基于节点的名称(也许是测试节点名称?),比如如果名称是“选项卡”,则插入一个选项卡...我的 xml 文件如下:

   <?xml version="1.0"?>
    <Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Header>
      </Header>
      <Body><p><p><b><u>Wednesday 14 December 2016</u></b></p><p></p><p>10:30<tab>Atletico Nacional  </tab><tab>v</tab><tab>Kashima Antlers  </tab><i><tab><tab>(Suita City Football Stadium)</tab></tab></i><b><tab><tab></tab></tab></b></p></p><p><p><b><u>Thursday 15 December 2016</u></b></p><p></p><p>10:30<tab>Club America  </tab><tab>v</tab><tab>Real Madrid  </tab><i><tab><tab>(Yokohama International Stadium)</tab></tab></i><b><tab><tab></tab></tab></b></p></p></Body>
    </Message>

预期的结果应该是这样的:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>  
<!DOCTYPE NEWS SYSTEM "structure.dtd">  
<OBJECT>  
<ID>12345</ID>  
<HEADER>SPORTS NEWS</HEADER>  
<OBJECT_BODY>  
Wednesday 14 December 2016  
10:30 Atletico Nacional v Kashima Antlers *(Suita City Football Stadium)*  
Thursday 15 December 2016  
10:30 Club America v Real Madrid *(Yokohama International Stadium)*  
</OBJECT_BODY>  
</OBJECT>

非常感谢您的帮助和支持,非常感谢!

【问题讨论】:

您的输出是文本文件吗?你打算如何格式化它? 请不要在 cmets 中发布代码。编辑您的问题并在此处发布预期的输出作为代码* @michael.hor257k,我的输出方法是 XML,基本上我尝试将这个 XML 文件转换为另一个基于模式文件的 XML 文件,以供特定的新闻系统读取。 (我已经更新了我的问题) 【参考方案1】:

我不能说我完全了解您是如何达到预期输出的,但请尝试将此作为您的起点:

XSLT 1.0

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

<xsl:template match="/Message">
    <OBJECT>  
        <ID>12345</ID>  
        <HEADER>SPORTS NEWS</HEADER>  
        <xsl:apply-templates select="Body"/>
    </OBJECT>  
</xsl:template>

<xsl:template match="Body">
    <OBJECT_BODY>  
        <xsl:apply-templates/>
    </OBJECT_BODY>  
</xsl:template>

<xsl:template match="p">
    <xsl:text>&#10;</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="tab">
    <xsl:text>&#9;</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="i">
    <xsl:text>*</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>*</xsl:text>
</xsl:template>

</xsl:stylesheet>

如有必要,添加其他模板来处理 bu 元素。

【讨论】:

我放在这里的例子只是整个 XML 文档的一小部分,我的 XSLT 文件也是一个很长的表格,这就是为什么我不能把它们都复制到这里......但我得到了从您的回答中得出的想法,现在可以完美运行...非常感谢您的有用回答和支持。 如果你能帮助我,还有一件可选的事情,如何将“i”节点文本格式化为“斜体”或“粗体”?我尝试了许多文本格式化方法,但它们对我没有用。 @JohnMiller XML 是纯文本格式;无法将其“格式化”为斜体或粗体。您唯一能做的就是添加某种标记。

以上是关于根据节点名称插入选项卡和 CR/LF的主要内容,如果未能解决你的问题,请参考以下文章

遍历选项卡列表并使用 if 语句显示不同的视图

jquery ajax 选项卡和表格工具

Twitter 引导选项卡和 javascript 事件

Bootstrap v3.3.5:从同一页面上的按钮激活选项卡和选项卡窗格

JavaFX 8 - 每个选项卡带有单独的 FXML 和控制器的选项卡和选项卡

单击选项卡和背景更改(不是选项卡的背景)