恢复包含“ <”和“>”的数据

时间:2019-08-29 11:55:06

标签: xml xslt

我希望我可以使用XSL文件来编辑XML文件。问题在于,数据中包含“ <”和“>”,并且将其理解为标记,而这是数据。

我尝试用<xsl: value-of select = "translate (node (), '&lt;', '*')" />删除“ <”,然后尝试将其返回,但它不起作用。

我的输入XML:

<text name="LEVEL1" >
    <p name="AS">Dear Sir/Madam</p>
    <p name="AS"><new-line/>Batman<new-line/>Superman</p>
</text>

我想要的输出:

    <LEVEL1>
        <AS>Dear Sir/Madam</AS>
        <AS><new-line/>Batman<new-line/>Superman</AS>
    </LEVEL1>

我的XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="text">
        <xsl:param name="text"/>
            <xsl:element name="{@name}">
                <xsl:for-each select="child::p">
                    <xsl:element name="{@name}">
                        <xsl:value-of select= "node()"/>
                    </xsl:element>
                </xsl:for-each>
            </xsl:element>
    </xsl:template>

</xsl:stylesheet>

我实际上有什么:

<?xml version="1.0" encoding="UTF-8"?>
<LEVEL1>
   <AS>Dear Sir/Madam</AS>
   <AS>
    </AS>
</LEVEL1>

1 个答案:

答案 0 :(得分:3)

严格来说,数据中没有“ <”和“>”。您正在查看XML的词法版本,但是当由XML解析器处理时,您要引用的<new-line/>成为一个元素。因此,问题是如何在输出中保留元素。由于使用xsl:value-of(仅返回元素的文本值),您当前正在丢失它。您真正需要使用的是xsl:apply-templates

这看起来像是您上一个问题的后续操作。您首先需要的是一个模板,该模板将一个具有name属性的元素与之匹配,以便您可以对其进行转换

<xsl:template match="*[@name]">
    <xsl:element name="{@name}">
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

对于其他元素,例如<new-line />,您可以使用身份模板。

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

将它们放在一起,就得到了...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:strip-space elements="*" />

    <xsl:template match="*[@name]">
        <xsl:element name="{@name}">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

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