【问题标题】:XSLT to convert CDATA into textXSLT 将 CDATA 转换为文本
【发布时间】:2019-10-17 16:46:56
【问题描述】:

在 XSLT 方面我是一个完全的新手,所以我正在努力寻找解决我的问题的方法。

我有以下来自 PeopleSoft 的 XML:

<?xml version="1.0"?>
<document>
  <ConnectedQuery>
    <Employee key="3000862">
      <Empl_ID>
        <![CDATA[12345678]]>
      </Empl_ID>
      <Name>
        <![CDATA[John Doe]]>
      </Name>
      <Job key="12345678,0,2018-09-17,0">
        <Empl_ID>
          <![CDATA[12345678]]>
        </Empl_ID>
        <Empl_Record>0</Empl_Record>
        <Effective_Date>2018-09-17</Effective_Date>
        <Effective_Sequence>0</Effective_Sequence>
      </Job>
    </Employee>
  </ConnectedQuery>
</document>

PeopleSoft“有帮助”将所有文本数据放入 CDATA 部分,我想删除 CDATA 并将字符串放在普通文本节点中:

<?xml version="1.0"?>
<document>
  <ConnectedQuery>
    <Employee key="3000862">
      <Empl_ID>12345678</Empl_ID>
      <Name>John Doe</Name>
      <Job key="12345678,0,2018-09-17,0">
        <Empl_ID>12345678</Empl_ID>
        <Empl_Record>0</Empl_Record>
        <Effective_Date>2018-09-17</Effective_Date>
        <Effective_Sequence>0</Effective_Sequence>
      </Job>
    </Employee>
  </ConnectedQuery>
</document> 

有人可以指导我在 XSLT 上的正确方向吗?我需要创建我想要的输出?非常感谢提前

【问题讨论】:

  • 一个简单的 identity transform 将删除 CDATA 标记。您可能还想添加 normalize-space(),因为 CDATA 块周围的空白是节点值的一部分。
  • 所以在被拉到另一个项目之后,我设法回到了这个问题。上面的答案似乎有效......除了在 PeopleSoft 中!我不确定现在为什么会这样(我在 PeopleSoft 中使用的其他 XLST 按预期工作)。有没有其他方法可以实现我可以在 PS 中尝试的相同目标?
  • 我怕对PeopleSoft不熟悉,所以不知道。为什么 CDATA 包装器一开始就有问题?任何未来的 XML 解析器都应该能够按原样处理原始 XML。

标签: xml xslt


【解决方案1】:

运行identity transform,它会将CDATA转换为普通字符串

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

https://xsltfiddle.liberty-development.net/bFWR5E1查看转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2016-08-22
    • 2014-01-03
    • 2012-02-06
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多