验证XSLT中的id属性

时间:2014-08-29 10:41:18

标签: xml xslt xsd xslt-2.0

在我的请求中有大约500个子元素,这些元素具有属性id,id是可选元素。我使用波纹管代码片段来转换我的请求ID属性。

<xsl:if test="@id">
    <xsl:attribute name="id">
        <xsl:value-of select="@id" />
    </xsl:attribute>
</xsl:if>

有没有办法在常见的地方进行<xsl:if test="@id">验证,影响到所有地方。否则我必须在每个地方检查这个。

请指教。比你......

3 个答案:

答案 0 :(得分:1)

该片段基本上将id属性从输入复制到输出(如果存在),否则不执行任何操作。

可以替换整个片段
<xsl:copy-of select="@id"/>

因为如果所选节点集为空,copy-of不执行任何操作。

答案 1 :(得分:1)

我没有看到你的代码除了复制已有的代码之外还做了什么。

在任何情况下,如果要将转换应用于具有id属性的所有元素,请编写与该属性匹配的模板,例如:

<xsl:template match="@id">
    <xsl:attribute name="new-id">
        <xsl:value-of select="." />
    </xsl:attribute>
</xsl:template>

这将保留现有值并重命名属性。

答案 2 :(得分:1)

通常,您将使用身份转换模板

启动样式表
<xsl:template match="@* | node()" mode="#all">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()" mode="#current"/>
  </xsl:copy>
</xsl:template>

逐级逐级复制所有内容。然后,您可以为需要特殊处理的元素和/或属性添加模板。

现在,只要您确保元素的模板执行<xsl:apply-templates select="@*"/><xsl:apply-templates select="@id"/>,就会复制属性。

如果你想转换一个元素,那么添加一个模板,例如。

<xsl:template match="/Address">
  <Add>
    <xsl:apply-templates select="@* , node()"/>
  </Add>
</xsl:template>