通过xslt添加属性

时间:2015-09-28 22:06:59

标签: xslt attributes

我正在处理一个问题,我需要在某些条件下向元素添加属性。这是我的XML。当AdditionalItem元素具有非空Value元素时,我需要添加一个名为 action 的属性:

    <AdditionalItems>
        **<AdditionalItem>**
            <Keys>
                <Key>Intake Source</Key>
            </Keys>
            <IdentifierDisplay>Intake Source</IdentifierDisplay>
            <DataType>
                <type>Enumeration</type>
                <enumeration>
                    <String>311</String>
                    <String>NIS Inspector</String>
                    <String>Other CCD Agency</String>
                </enumeration>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <Enumerations>
                    <Enumeration>
                        <Keys>
                            <Key>311</Key>
                        </Keys>
                        <IdentifierDisplay>311</IdentifierDisplay>
                    </Enumeration>
                    <Enumeration>
                        <Keys>
                            <Key>NIS Inspector</Key>
                        </Keys>
                        <IdentifierDisplay>NIS Inspector</IdentifierDisplay>
                    </Enumeration>
                    <Enumeration>
                        <Keys>
                            <Key>Other CCD Agency</Key>
                        </Keys>
                        <IdentifierDisplay>Other CCD Agency</IdentifierDisplay>
                    </Enumeration>
                </Enumerations>
                <inputRequired>false</inputRequired>
                <fieldType>Enumeration</fieldType>
            </DataType>
            <Name>Intake Source</Name>
            **<Value>311</Value>**
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Other CCD Agency</Key>
            </Keys>
            <IdentifierDisplay>Other CCD Agency</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Other CCD Agency</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>311 Agent</Key>
            </Keys>
            <IdentifierDisplay>311 Agent</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>311 Agent</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Case Number</Key>
            </Keys>
            <IdentifierDisplay>Case Number</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Case Number</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Case Created Date</Key>
            </Keys>
            <IdentifierDisplay>Case Created Date</IdentifierDisplay>
            <DataType>
                <type>Date</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Date</fieldType>
            </DataType>
            <Name>Case Created Date</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Complaintant Name:</Key>
            </Keys>
            <IdentifierDisplay>Complaintant Name:</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Complaintant Name:</Name>
            <Value>Fred Fredderson</Value>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Phone Number:</Key>
            </Keys>
            <IdentifierDisplay>Phone Number:</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Phone Number:</Name>
            <Value>3033333333</Value>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Email</Key>
            </Keys>
            <IdentifierDisplay>Email</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Email</Name>
            <Value>1@2.com</Value>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Council District:</Key>
            </Keys>
            <IdentifierDisplay>Council District:</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Council District:</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Inspector Distict:</Key>
            </Keys>
            <IdentifierDisplay>Inspector Distict:</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Inspector Distict:</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
        <AdditionalItem>
            <Keys>
                <Key>Permit Number</Key>
            </Keys>
            <IdentifierDisplay>Permit Number</IdentifierDisplay>
            <DataType>
                <type>String</type>
                <inputRange>
                    <maxValue>0.0</maxValue>
                </inputRange>
                <inputRequired>false</inputRequired>
                <fieldType>Text</fieldType>
            </DataType>
            <Name>Permit Number</Name>
            <Value/>
            <security>F</security>
            <drillDown>false</drillDown>
        </AdditionalItem>
    </AdditionalItems>

我的第一个想法是在for-each上执行//AdditionalItem,然后检查Value元素的长度是否为&gt; 0.如果是,请添加操作属性。这看起来像是一种合理的方法吗?类似的东西:

<xsl:for-each select="/ns2:UpdateCAP/ns2:AdditionalInformation//AdditionalItem">
    <xsl:if test="string-length(Value) > 0">
      <!-- somehow add the attribute -->
    </xsl:if>
</xsl:for-each>

1 个答案:

答案 0 :(得分:1)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="AdditionalItem[Value[text()]]">
        <xsl:copy>
            <xsl:attribute name="action">Add</xsl:attribute>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我们无法使用xslt更改现有文档xml。我们需要复制所有元素,将属性添加到所需位置 因此,我们使用第一个模板复制所有节点和属性,并复制包含非空内部Value节点的AdditionalItem节点,使用第二个模板添加属性。

AdditionalItem匹配名为AdditionalItem的节点 AdditionalItem[Value]匹配名称为AdditionalItem的节点和名称为Value且具有任何内容(可能为空)的内部节点 AdditionalItem[Value[text()]]匹配名称为AdditionalItem的节点和名称为Value且具有一些内容(非空)的内部节点。