2014-08-29 52 views
0

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

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

有什么办法可以在普通的地方做<xsl:if test="@id">验证,影响到所有的地方。否则,我必须在每个地方查看。

请指教我。比你...

+0

这对我没有意义。你为什么要测试是否有'id'属性,然后创建一个,如果已经有一个?请解释这个的目的。同时显示更多XSLT代码,输入XML,输出结果以及您的XSD(因为您使用'xsd'标记了问题并提及验证)。 – 2014-08-29 10:47:06

+0

如果我在没有的情况下使用,请求在我的变换中有没有id属性的元素,那么put元素的id就没有值。如此。如果它不在请求中,我不想创建id属性。正因为如此,我使用了测试条件。 – user3496599 2014-08-29 11:15:04

+0

@MathiasMüller – user3496599 2014-08-29 11:45:39

回答

1

这段代码基本上复制id属性从输入到输出(如果存在的话),否则什么也不做。这整个片段可以通过

<xsl:copy-of select="@id"/> 

因为copy-of更换什么都不做,如果选择的节点集合是空的。

1

我没有看到您的代码除了复制已经存在的内容之外的任何内容。

在任何情况下,如果你想要一个转型适用于有id属性的所有元素,编写模板匹配的属性,例如:

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

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

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> 
+0

'<! - 改变标签 - > 的 \t \t \t \t '这是我的代码,我的输入xml是'

\t ABC
'但它不是在输出中创建属性ID。 – user3496599 2014-08-29 11:37:46

+0

请注意,我写了'mode =“#all”'和'mode =“#current”'。至于更改元素,请注意您需要执行apply-templates。我将编辑并显示。 – 2014-08-29 11:48:47

+0

如果我使用了“mode =”#all“和mode =”#current“我得到了波纹管错误一个属性的值必须是QName或空格分隔的QNames列表的值为'#all'' 致命错误:'无法编译样式表' – user3496599 2014-08-29 12:02:16