XSL检查同一名称和属性的多个元素是否等于给定文本

时间:2012-03-30 15:51:03

标签: xslt

我正在编写此XSLT文件,并且在如何执行以下操作方面存在问题。我有一个具有相同名称属性的元素列表,我需要将它们复制并检查它们是否具有必需的文本。如果没有元素没有添加一个元素。

示例XML:

<record>
  </Title>
  </subTitle>
  <note tag='1'>
    <access tag='1'>nothing</access>
    <access tag='a'>Home</access>
    <access tag='a'>School</access>
  </note tag='1'>
</record>

通过该示例,它将输出:

<record>
  </Title>
  </subTitle>
  <note tag='1'>
    <access tag='1'>nothing</access>
    <access tag='a'>Home</access>
    <access tag='a'>School</access>
    <access tag="a'>Required</access>
  </note tag='1'>
</record>

如果生成的xml再次通过xslt,它将按原样输出而不进行任何更改。如果使用属性a访问只能是1个元素,我知道如何做到这一点。我遇到的问题是检查多个。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是一个简短的解决方案

<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()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "note[not(access[@tag = 'a' and . = 'Required'])]">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
   <access tag="a">Required</access>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档(将格式错误的原始文档更正为格式良好的XML文档):

<record>
    <Title/>
    <subTitle/>
    <note tag='1'>
        <access tag='1'>nothing</access>
        <access tag='a'>Home</access>
        <access tag='a'>School</access>
    </note>
</record>

产生了想要的正确结果

<record>
   <Title/>
   <subTitle/>
   <note tag="1">
      <access tag="1">nothing</access>
      <access tag="a">Home</access>
      <access tag="a">School</access>
      <access tag="a">Required</access>
   </note>
</record>

答案 1 :(得分:0)

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

<xsl:template match="note[count(access[text()='Required'])=0]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:element name="access">
        <xsl:attribute name="tag">a</xsl:attribute>
        Required
        </xsl:element>
    </xsl:copy>
</xsl:template>