如何更改节点值xslt

时间:2016-07-08 11:27:57

标签: xml xslt xslt-1.0

我想对一个xml进行一些修改我尝试使用xslt句子但我无法做到,复制后我在尝试进行更改时删除了子节点。 发布了xml:

`

<tree>
       <sublevel>
      <definition>subnetting</definition>
      <status>availabe</status>
      <categories>
          <category>
                    <label>IPV4</label>
                    <attributes>
                        <attribute>
                            <label>MASK</label>
                            <value>/24</value>
                        </attribute>
                        <attribute>
                            <label>STARTING_IP</label>
                            <value>10.0.0.1</value>
                        </attribute>
                        <attribute>
                            <label>Type</label>
                            <value>4</value>
                        </attribute>
                    </attributes>
                </category>
      </categories>
      <identifier>subnetworkipv4correct</identifier>
   </sublevel>
</tree>

我想使用一个xslt来执行输出:

`

<tree>
   <sublevel>
      <definition>subnetting</definition>
      <status>availabe</status>
      <origen>template</origen>
      <categories>
          <category>
                    <label>IP</label>
                    <attributes>
                        <attribute>
                            <label>Mask</label>
                            <value>/24</value>
                        </attribute>
                        <attribute>
                            <label>START</label>
                            <value>10.0.0.1</value>
                        </attribute>
                        <attribute>
                            <label>Version</label>
                            <value>4</value>
                        </attribute>
                    </attributes>
                </category>
      </categories>
      <identifier>subnetworkipv4correct</identifier>
      </sublevel>
    </tree>

`

我测试了很多模板,但我无法做到。

2 个答案:

答案 0 :(得分:1)

您需要更准确地了解您为完整答案所做的事情,但希望有一些指示应该有所帮助。使用标识模板,并为需要删除/更改的特定元素覆盖它。

要删除origen元素,请使用:

<xsl:template match="origen"/>

这只是匹配它,并且不输出任何内容,有效地删除它。

要修改label元素,您可以使用:

<xsl:template match="category/label[. = 'IPV4']/text">IP</xsl:template>

或者:

<xsl:template match="category/label/text()">
  <xsl:choose>
    <xsl:when test=". = 'IPV4']">IP</xsl:when>
    <xsl:otherwise>(default)</xsl:otherwise>
  </xsl:choose>
</xsl:template>

您可以用类似的方式更改其他元素的值。

答案 1 :(得分:0)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="@*|node()" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="status[. = 'availabe']">
    <xsl:call-template name="identity"/>
    <origen>template</origen>
  </xsl:template>

  <xsl:template match="label/text()[. = 'IPV4']">IP</xsl:template>
  <xsl:template match="label/text()[. = 'STARTING_IP']">START</xsl:template>
  <xsl:template match="label/text()[. = 'Type']">Version</xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<tree>
    <sublevel>
        <definition>subnetting</definition>
        <status>availabe</status>
        <categories>
            <category>
                <label>IPV4</label>
                <attributes>
                    <attribute>
                        <label>MASK</label>
                        <value>/24</value>
                    </attribute>
                    <attribute>
                        <label>STARTING_IP</label>
                        <value>10.0.0.1</value>
                    </attribute>
                    <attribute>
                        <label>Type</label>
                        <value>4</value>
                    </attribute>
                </attributes>
            </category>
        </categories>
        <identifier>subnetworkipv4correct</identifier>
    </sublevel>
</tree>

产生完全想要的结果

<tree>
   <sublevel>
      <definition>subnetting</definition>
      <status>availabe</status>
      <origen>template</origen>
      <categories>
         <category>
            <label>IP</label>
            <attributes>
               <attribute>
                  <label>MASK</label>
                  <value>/24</value>
               </attribute>
               <attribute>
                  <label>START</label>
                  <value>10.0.0.1</value>
               </attribute>
               <attribute>
                  <label>Version</label>
                  <value>4</value>
               </attribute>
            </attributes>
         </category>
      </categories>
      <identifier>subnetworkipv4correct</identifier>
   </sublevel>
</tree>

注意:为了更系统,更牢固地掌握XSLT,请观看我的Pluralsight课程&#34; XSLT 2.0 and 1.0 Foundations&#34;

另见https://stackoverflow.com/a/322079/36305