我是CSS新手,遇到了障碍 . 我有一个图像详细信息列表,如下所示 .
<Files IsList="true">
<Item>
<FileSize>97 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_7vxsysv.jpg</Name>
<Description>Picture</Description>
</Item>
<Item>
<FileSize>108 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_9cxjbh7.jpg</Name>
<Description>Picture</Description>
</Item>
<Item>
<FileSize>109 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_9cxjbh7_Annotated.jpg</Name>
<Description>(annotated)</Description>
</Item>
<Item>
<FileSize>170 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_omau6bn.jpg</Name>
<Description>Picture</Description>
</Item>
<Item>
<FileSize>175 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_omau6bn_Annotated.jpg</Name>
<Description>(annotated)</Description>
</Item>
</Files>
所有图像都有一个原始文件,一些图像有一个带注释的副本(由描述和名称后缀标识) .
我需要显示所有图像(在一个表中有3个图像到一行),逻辑:
-
如果有带注释的副本,则仅显示带注释的版本
-
如果没有带注释的副本显示原件 .
Desired Outcome是一个选择语句,产生以下结果 .
<Item>
<FileSize>97 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_7vxsysv.jpg</Name>
<Description>Picture</Description>
</Item>
<Item>
<FileSize>109 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_9cxjbh7_Annotated.jpg</Name>
<Description>(annotated)</Description>
</Item>
<Item>
<FileSize>175 kb</FileSize>
<Type>image/jpeg</Type>
<Name>CR_0_Pc_omau6bn_Annotated.jpg</Name>
<Description>(annotated)</Description>
</Item>
我试图循环遍历所有节点并使用IF语句来确定是否显示了哪些节点,但是因为我使用position()来确定从哪一个开始新行,这不起作用,因为并非所有图像都显示出来,抛弃了行计算 .
我认为select需要基于Name元素值的子字符串,并与其他Name元素的子字符串进行比较 .
这可能吗?
2 回答
您可以使用以下表达式选择所请求的项目:
定义一个键之后:
这假设所有项目名称都是15个字符长 . 如果这个假设不正确,那么它会变得更复杂 .
请注意,仅选择项目是不够的,因为所选项目保持其原始上下文 . 为了使选定的项目成为兄弟姐妹,你需要将它们变成一个变量 . 以下是完整样式表的示例,将所选项目分为三列:
XSLT 1.0
我不知道你是否想要XSLT 1.0或XSLT 2.0,并且你不想要一个html表输出或xml输出(你似乎在这方面自相矛盾),所以这可能不完全符合你的要求,但它可能会有所帮助 .
这个XSLT 2.0样式表......
...将改变这个输入文件......
...进入这个输出html页面......
设计说明
分组(
xsl:for-each-group
)实际上只是将输出编组到3列表中 . table 粗糙 . 如果您需要常规表来支持旧版浏览器,则需要在最后一行添加一些额外代码 .这是你在关闭
</tr>
之前添加的内容,以使其成为常规xsl:for-each-group/@select
中的XPath表达式为此解决方案带来了沉重的负担 . 它选择所有Item
元素,这些元素要么带注释,要么没有匹配的带注释的兄弟 . 这基本上是您要处理输出的内容 .更新
这是一个等效的XSLT 1.0解决方案..
以上假设您的XSLT 1.0引擎支持exslt . 请注意,没有理由不升级到XSLT 2.0 . 如果您的平台是浏览器,那么您可以使用Saxon CE来实现升级 . 使用the Piez method使输出表成为常规 . 如果效率太低,还有其他选择 .