能否在XPath 2/3的some/satisfies表达式中访问变量$x?
构建NOTATION语句的XSLT实现尝试
我创建了变量$notations来存储实体的扩展名,用于构建NOTATION语句:
<xsl:variable name="notations"> <xsl:for-each select="//@infoEntityIdent"> <xsl:variable name="uri" as="xs:anyURI" select="unparsed-entity-uri(.)"/> <xsl:analyze-string select="$uri" regex="([^.]*$)"> <xsl:matching-substring> <xsl:value-of select="regex-group(1)"/> </xsl:matching-substring> </xsl:analyze-string> <xsl:text> </xsl:text> </xsl:for-each> </xsl:variable>
尝试使用some/satisfies表达式时,<xsl:text>中的变量$x会超出作用域:
<xsl:if test="some $x in $notations satisfies matches($x,'svg', 'i')"> <xsl:text disable-output-escaping="yes" expand-text="1"><!NOTATION {$x} SYSTEM "SVG"></xsl:text> </xsl:if> <xsl:if test="some $x in $notations satisfies matches($x,'jpg', 'i')"> <xsl:text disable-output-escaping="yes" expand-text="1"><!NOTATION {$x} SYSTEM "JPG"></xsl:text> </xsl:if>
如果无法访问$x,就只能硬编码'SVG',同时对实体使用upper-case()来保证大小写匹配:
<xsl:if test="some $x in $notations satisfies matches($x,'svg', 'i')"> <xsl:text disable-output-escaping="yes"><!NOTATION SVG SYSTEM "SVG"></xsl:text> </xsl:if>
另一种可行的实现方式是结合distinct-values()和tokenize()使用循环:
<xsl:for-each select="distinct-values(tokenize($notations))"> <xsl:choose> <xsl:when test="matches(.,'svg', 'i')"> <xsl:text disable-output-escaping="yes" expand-text="1"><!NOTATION {.} SYSTEM "SVG"></xsl:text> </xsl:when> <xsl:when test="matches(.,'JPG','i')"> <xsl:text disable-output-escaping="yes" expand-text="1"><!NOTATION {.} SYSTEM "image/jpeg"></xsl:text> </xsl:when> </xsl:choose> <xsl:text>
</xsl:text> </xsl:for-each>
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

