使用xslt在标签上放置条件?

时间:2018-07-06 10:58:43

标签: xml xslt

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

1 个答案:

答案 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>