How to use contains in xslt?

2019-09-11 03:49发布

I'm trying use contains in xslt for return any values. for example: I've this xml:

<BOOKS>
    <BOOK>
        <TITLE>title1</TITLE>
        <ISSN>12313213</ISSN>
    </BOOK>
    <BOOK>
        <TITLE>title2</TITLE>
        <ISSN>67895776</ISSN>
    </BOOK>
    <BOOK>
        <TITLE>title3</TITLE>
        <ISSN>54363645</ISSN>
    </BOOK>
</BOOKS>

and this static xml(issn.xml):

<ISSNS>
    <ISSN>
        <VALUE>12313213, 67895776</VALUE>
        <PRICE>1235,23</PRICE>
    </ISSN>
    <ISSN>
        <VALUE>5463432, 54363645</VALUE>
        <PRICE>345,23</PRICE>
    </ISSN>
</ISSNS>

I need to verify if have book issn in issn xml. My code:

<xsl:template match="/">
<xsl:variable name="issn" select="document('file:///E:/issn.xml')"/>
<BOOKS> 
    <xsl:for-each select="$issn/ISSNS/ISSN">
        <xsl:variable name="value" select="VALUE"/>
        <xsl:variable name="price" select="ESTRATO"/>
        <xsl:for-each select="//BOOKS">
            <xsl:for-each select="BOOK">
                <xsl:if test="contains($value, @ISSN)">
                    <BOOK>
                    <TITLE><xsl:value-of select="@TITLE"/></TITLE>
                    <ISSN><xsl:value-of select="$value"/></ISSN>
                    <PRICE><xsl:value-of select="$price"/></PRICE>
                    </BOOK>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>
</BOOKS>    
</xsl:template> 

I wanna return when the book issn contains in issn value. Can anyone Help me? Thanks

标签: xslt
1条回答
欢心
2楼-- · 2019-09-11 04:07

If I understand this correctly, you want to do:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="issns" select="document('file:///E:/issn.xml')"/>

<xsl:template match="/BOOKS">
    <BOOKS>
        <xsl:for-each select="BOOK">
            <xsl:variable name="issn" select="$issns/ISSNS/ISSN[contains(VALUE, current()/ISSN)] "/>
            <xsl:if test="$issn">
                <BOOK>
                    <xsl:copy-of select="*"/>
                    <xsl:copy-of select="$issn/PRICE"/>
                </BOOK>
            </xsl:if>
        </xsl:for-each>
    </BOOKS>
</xsl:template> 

</xsl:stylesheet>

Note that this assumes one ISSN value cannot contain another (which could possibly generate a false match).

查看更多
登录 后发表回答