我希望我可以使用XSL文件来编辑XML文件。问题在于,数据中包含“ <”和“>”,并且将其理解为标记,而这是数据。
我尝试用<xsl: value-of select = "translate (node (), '<', '*')" />
删除“ <”,然后尝试将其返回,但它不起作用。
我的输入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>
答案 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>