我正在处理一个问题,我需要在某些条件下向元素添加属性。这是我的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>
答案 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且具有一些内容(非空)的内部节点。