XSL新手
我有一个xml文件,
<parent>
<child1>The child</child1>
<child2>
<subchild1>The subchild 1 </subchild1>
<subchild2>The subchild 2 </subchild2>
<ref>1</ref>
</child2>
<child3>
<address> 23 </address>
<mail> test@test.com </mail>
</child3>
</parent>
我希望xsl进行以下更改
<parent>
<child1>The child</child>
<child2>
<subchild1>The subchild 1 </subchild>
<subchild2>The subchild 2 </subchild>
<ref refid = "aff1">1</ref>
</child2>
<child3>
<address> 23 </address>
<mail type="email"> test@test.com </mail>
</parent>
到目前为止,我的XSL是
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
我可以遍历每个标记和文本,但是如何放置if语句并进行更改。
aff
将是固定的,但数字将被附加。
我在ubuntu中运行此方法的方式是
$ xsltproc iterate1.xsl headerout1.xml
答案 0 :(得分:1)
使用身份模板可以很好地开始工作。您现在要做的就是添加与要更改的节点匹配的模板。 XSLT具有模板优先级的概念,因此,如果两个模板与给定节点匹配,则使用优先级较高的模板。 (与匹配“ node()”的模板的优先级为-0.5的模板相比,与“ ref”之类的特定节点名称匹配的模板的优先级为0)
因此,要转换ref
,您可以这样做。...
<xsl:template match="ref">
<xsl:copy>
<xsl:attribute name="id">
<xsl:value-of select="." />
</xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
或更妙的是,使用Attribute Value Templates,然后执行以下操作:
<xsl:template match="ref">
<ref id="{.}">
<xsl:apply-templates select="@*|node()"/>
</ref>
</xsl:template>
您将为mail
做类似的事情(尽管由于值不是动态的,所以稍微简单些)
尝试使用此XSLT
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mail">
<mail type="email">
<xsl:apply-templates select="@*|node()"/>
</mail>
</xsl:template>
<xsl:template match="ref">
<ref id="{.}">
<xsl:apply-templates select="@*|node()"/>
</ref>
</xsl:template>
</xsl:transform>