2016-07-06 127 views
0

我想聚合一個節點的所有子節點中存在的布爾值並將其添加到其父節點。 我的XML文檔的樣子:xslt兒童屬性的布爾聚合

<?xml version="1.0" encoding="UTF-8"?> 
<module> 
    <entity name="test" > 
    <attributes name="att1" translatable="true"> 
    <attributes name="att2" translatable="false"> 
    <attributes name="att3" translatable="false"> 
    <attributes name="att4" translatable="true"> 
    </attributes> 
    </entity> 
</module> 

並將其轉換爲:

<?xml version="1.0" encoding="UTF-8"?> 
<module> 

    <!-- 
     At the entity level the property translatable shall be the result of 
     the OR aggregation of all children attributes.translatable 
     i.e. 
     iterate for all attributes (true OR false OR false OR true = true) ==> entity.translatable=true 

    --> 

<entity name="test" translatable="true"> 
    <attributes name="att1" translatable="true"> 
    <attributes name="att2" translatable="false"> 
    <attributes name="att3" translatable="false"> 
    <attributes name="att4" translatable="true"> 
    </attributes> 
    </entity> 
</module> 
+0

,使其結構良好的請編輯源XML。 –

+0

你在新的xml中添加translatable =「true」嗎? – Developer

回答

1

迭代所有屬性(真或假或假或真=真) ==> entity.translatable = true

無需迭代 - 只需要詢問是否至少有一個屬性值爲真實

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="entity"> 
    <entity name="{@name}" translatable="{boolean(attribute[@translatable='true'])}" > 
     <xsl:apply-templates/> 
    </entity> 
</xsl:template> 

</xsl:stylesheet> 

上述假定合式 XML輸入,如:

<module> 
    <entity name="test"> 
    <attribute name="att1" translatable="true"/> 
    <attribute name="att2" translatable="false"/> 
    <attribute name="att3" translatable="false"/> 
    <attribute name="att4" translatable="true"/> 
    </entity> 
</module>