XSLT属性基于Value更改

时间:2016-10-07 17:23:31

标签: xml xslt

我是XSLT的新手,想知道我是否能得到一些帮助。

我目前有一个XML,它包含以下格式的大量副本:

          <item:items>
            <item:item action="ingest" id="USAUS868509">
                <item:itemID>1157245</item:itemID>
                <item:spotType>commercial</item:spotType>
            </item:item>
           <item:items>

我的任务是替换id属性的值。我需要根据代码的数字部分更改此值。如果该值大于850000,则格式应更改为USA868509。如果该值小于850000,则将id值更改为仅包含数字。 XML中的其余值应保持完全相同。

我目前有以下xslt:

             <xsl:template match="@*|node()">
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()"/>
                   </xsl:copy>
              </xsl:template>

             <xsl:template match="//items/item[@id]">  
                <xsl:choose>
                    <xsl:when test="substring(id,5) &gt;= 845986">
                        <xsl:attribute name="id">
                            <xsl:value-of select="substring(id,5)"/>
                        </xsl:attribute> 
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:attribute name="id">
                            <xsl:value-of select="id"/>
                        </xsl:attribute> 
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:template>  

我无法识别我想要更改的值,因为XSLT不会对变量进行循环。有没有办法可以改变我的XSLT以获得这种逻辑?

1 个答案:

答案 0 :(得分:0)

让我们有以下格式正确的输入示例:

<强> XML

throw er; // Unhandled 'error' event
  ^

Error: read EIO
  at exports._errnoException (util.js:890:11)
  at TTY.onread (net.js:550:26)

应用以下样式表:

XSLT 1.0

<items>
  <item action="ingest" id="USAUS849999">
    <itemID>1157245</itemID>
    <spotType>commercial</spotType>
  </item>
  <item action="ingest" id="USAUS850001">
    <itemID>1157246</itemID>
    <spotType>commercial</spotType>
  </item>
</items>

会产生这样的结果:

<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:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@id">
    <xsl:variable name="code" select="substring(., 6)" />
    <xsl:attribute name="id">
        <xsl:if test="$code >= 850000">USA</xsl:if>
        <xsl:value-of select="$code" />
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>