如果找到属性1234并且boolean1值,则代码将Y或N分配给元素ABC。 但有时属性ID 1234并不存在于/ Response / Specification / Section / item / Property中。 因此元素ABC在输出xml中保持为空。 当属性1234不存在时,我想将Element值设置为N. 我对XSL和XML都很陌生。
输入XML,其中每个规范标记包含多个部分和项目。每个部分和项目都有自己的ID。
<Response>
<Specification>
<Section>
<sectionid>9999</sectionid>
<item>
<itemid>8888</itemid>
<property>
<id>1234</id>
<property>ABC<property>
<boolean1>1</boolean1>
</property>
<property>
<id>5678</id>
<property>XYZ<property>
<boolean1>0</boolean1>
</property>
</property>
<property>
</property>
</item>
<item>
</item>
<item>
</item>
</Section>
<Section>
</Section>
<Section>
</Section>
</Specification>
</Response>
良好形成的输入xml的小样本。
<Response>
<Specification>
<Section>
<Sectionid>9999</Sectionid>
<Item>
<Itemid>8888</Itemid>
<Property>
<id>1234</id>
<Property>ABC</Property>
<Boolean1>1</Boolean1>
</Property>
<Property>
<id>5678</id>
<Property>XYZ</Property>
<Boolean1>0</Boolean1>
</Property>
</Item>
</Section>
</Specification>
</Response>
在原帖中,我删除了一些元素。我虽然会简短而简单。以下是使用所有元素
更新的xsl<ABC>
<xsl:for-each select="Response/Specification/Section/Item/Property[id=1234]">
<xsl:choose>
<xsl:when test="boolean1=1" >
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</ABC>
<XYZ>
<xsl:for-each select="Response/Specification/Section/Item/Property[id=5678]">
<xsl:choose>
<xsl:when test="boolean1=1" >
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</XYZ>
预期输出XML只有父标签,其中包含所有其他标签,如ABC,XYZ,PQR等。当属性ID 1234不存在时,输出为空ABC标签。这里我们要添加N而不是空标记。
<parenttag>
</ABC>
<XYZ>N</XYZ>
</parenttag>
答案 0 :(得分:2)
如果您有多个属性(或者属性?还记得XML,XSLT是区分大小写的),我会首先迭代 property 元素,但此时不检查任何值
<xsl:for-each select="Response/Specification/Section/item/property">
在此期间,如果您想要创建一个基于子属性元素的名称的元素,您可以将 xsl:element 与属性值模板一起使用动态指定元素名称。
<xsl:element name="{property}">
然后,在此测试条件中,您可以拥有 xsl:choose ,包括检查&#34; 1234&#34;
<xsl:choose>
<xsl:when test="ID=1234 and BOOLEAN1=1" >
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<parenttag>
<xsl:for-each select="Response/Specification/Section/Item/Property">
<xsl:element name="{Property}">
<xsl:choose>
<xsl:when test="id=1234 and Boolean1=1">
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:for-each>
</parenttag>
</xsl:template>
</xsl:stylesheet>
编辑:如果元素名称取决于ID,并且您希望它们始终存在,您可以这样做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<parenttag>
<ABC>
<xsl:choose>
<xsl:when test="Response/Specification/Section/Item/Property[id=1234]/Boolean1=1">
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
</ABC>
<XYZ>
<xsl:choose>
<xsl:when test="Response/Specification/Section/Item/Property[id=5678]/Boolean1=1">
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
</XYZ>
</parenttag>
</xsl:template>
</xsl:stylesheet>
尽管为避免代码重复,您可以使用命名模板。试试这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<parenttag>
<ABC>
<xsl:call-template name="check">
<xsl:with-param name="id" select="'1234'"/>
</xsl:call-template>
</ABC>
<XYZ>
<xsl:call-template name="check">
<xsl:with-param name="id" select="'5678'"/>
</xsl:call-template>
</XYZ>
</parenttag>
</xsl:template>
<xsl:template name="check">
<xsl:param name="id"/>
<xsl:choose>
<xsl:when test="Response/Specification/Section/Item/Property[id=$id]/Boolean1=1">
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>N</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>