我有点想要在xml文件上进行转换。
基本上我正在尝试复制所有xml,但更改了一些只能以此开头的标签
XML代码:
<test alt="foo" title="bar"/>
传递xsl之后我想得到什么:
<test alt="foo"/>
或
<change alt="foo" title=""/>
事实上,有时我得到了很多属性的标签,所以我不想进行模板匹配,然后手动更改每个属性。
其实我这样做:
<xsl:template match="test">
<change><xsl:apply-templates select="@*|node()"/></change>
</xsl:template>
<xsl:template match="test/@title">
<xsl:attribute name="title">
<xsl:value-of select=""/>
</xsl:attribute>
</xsl:template>
但它并没有改变输出中的标题内容。
答案 0 :(得分:2)
对于所有此类任务,您应该从身份转换模板
开始<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后为需要特殊处理的节点添加模板,例如
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="test/@title"/>
会复制所有内容,但会删除title
元素的所有test
属性。
或者
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="test">
<change><xsl:apply-templates select="@*|node()"/></change>
</xsl:template>
<xsl:template match="test/@title">
<xsl:attribute name="title"/>
</xsl:template>
应该实现你的第二个要求。如果您仍有问题,请发布最小但完整的样本,以便我们重现问题。
答案 1 :(得分:0)
要删除alt
的任何属性,请使用带有例外的身份转换:
样式表(删除其他属性)
<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:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*[name() != 'alt']"/>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="utf-8"?>
<test alt="foo"/>
或者,要将除alt
之外的所有属性的值设置为""
,请使用:
样式表(将其他属性设为空)
<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:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="test">
<change>
<xsl:apply-templates select="@*|node()"/>
</change>
</xsl:template>
<xsl:template match="@*[name() != 'alt']">
<xsl:attribute name="{name()}"/>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="utf-8"?>
<change alt="foo" title=""/>