Xml 如何在XSLT中创建键值对并使用键获取值

Xml 如何在XSLT中创建键值对并使用键获取值,xml,xslt,Xml,Xslt,在XSLT中,我有来自XML的状态,在对应于该状态时,我有自己的状态代码,我想将其放入转换后的XML中 源XML: <states> <state>New York</state> <state>California</state> </states> 纽约 加利福尼亚 预期结果: <states> <state>NY</state> <state>CA&

在XSLT中,我有来自XML的状态,在对应于该状态时,我有自己的状态代码,我想将其放入转换后的XML中

源XML:

<states>
<state>New York</state>
<state>California</state>
</states>

纽约
加利福尼亚
预期结果:

<states>
    <state>NY</state>
    <state>CA</state>
</states>

纽约
加利福尼亚州

因为我有状态列表,所以我不能使用whenIf语句,所以在XSLT 1.0或2.0中,它们是否有解决此问题的优化方法?提前感谢。

这里有一种方法可以让您了解:

XSLT2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://example.com/my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="state" match="state" use="." />

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

<xsl:template match="state">
    <xsl:copy>
        <xsl:value-of select="key('state', ., document(''))/@code"/>
    </xsl:copy>
</xsl:template>

<my:states>
    <state code="AL">Alabama</state>
    <state code="AK">Alaska</state>
    <state code="AZ">Arizona</state>
    <state code="AR">Arkansas</state>
    <state code="CA">California</state>
    <state code="CO">Colorado</state>
    <state code="CT">Connecticut</state>
    <state code="DE">Delaware</state>
    <state code="DC">District of Columbia</state>
    <state code="FL">Florida</state>
    <state code="GA">Georgia</state>
    <state code="HI">Hawaii</state>
    <state code="ID">Idaho</state>
    <state code="IL">Illinois</state>
    <state code="IN">Indiana</state>
    <state code="IA">Iowa</state>
    <state code="KS">Kansas</state>
    <state code="KY">Kentucky</state>
    <state code="LA">Louisiana</state>
    <state code="ME">Maine</state>
    <state code="MD">Maryland</state>
    <state code="MA">Massachusetts</state>
    <state code="MI">Michigan</state>
    <state code="MN">Minnesota</state>
    <state code="MS">Mississippi</state>
    <state code="MO">Missouri</state>
    <state code="MT">Montana</state>
    <state code="NE">Nebraska</state>
    <state code="NV">Nevada</state>
    <state code="NH">New Hampshire</state>
    <state code="NJ">New Jersey</state>
    <state code="NM">New Mexico</state>
    <state code="NY">New York</state>
    <state code="NC">North Carolina</state>
    <state code="ND">North Dakota</state>
    <state code="OH">Ohio</state>
    <state code="OK">Oklahoma</state>
    <state code="OR">Oregon</state>
    <state code="PA">Pennsylvania</state>
    <state code="RI">Rhode Island</state>
    <state code="SC">South Carolina</state>
    <state code="SD">South Dakota</state>
    <state code="TN">Tennessee</state>
    <state code="TX">Texas</state>
    <state code="UT">Utah</state>
    <state code="VT">Vermont</state>
    <state code="VA">Virginia</state>
    <state code="WA">Washington</state>
    <state code="WV">West Virginia</state>
    <state code="WI">Wisconsin</state>
    <state code="WY">Wyoming</state>
</my:states>

</xsl:stylesheet>

阿拉巴马州
阿拉斯加州
亚利桑那州
阿肯色州
加利福尼亚
科罗拉多州
康涅狄格州
特拉华州
哥伦比亚特区
佛罗里达州
佐治亚州
夏威夷
爱达荷州
伊利诺伊州
印第安纳州
爱荷华州
堪萨斯州
肯塔基州
路易斯安那州
缅因州
马里兰
马萨诸塞州
密歇根
明尼苏达州
密西西比
密苏里州
蒙大拿
内布拉斯加州
内华达州
新罕布什尔州
新泽西州
新墨西哥州
纽约
北卡罗来纳州
北达科他州
俄亥俄州
奥克拉荷马
俄勒冈
宾夕法尼亚
罗德岛
南卡罗来纳州
南达科他州
田纳西州
得克萨斯州
犹他州
佛蒙特州
弗吉尼亚州
华盛顿
西弗吉尼亚州
威斯康星州
怀俄明州
如果愿意,可以将状态列表及其代码放在外部XML文档中并从中进行查找

因为我有状态列表,所以我不能使用when或If语句


实际上,使用
xsl:choose
也可以工作。

您可以将外部文件包含在映射中并访问映射。我使用'b1.xml'作为文件名。它用短名称替换全名

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:variable name="StateMap" select="document('b1.xml')/StateMapping" />

  <xsl:template match="states">
    <states>        
      <xsl:apply-templates select="state" />
    </states>
  </xsl:template>

  <xsl:template match="state">
    <xsl:variable name="toMap" select="text()" />
    <state><xsl:value-of select="$StateMap/Map[@name = $toMap]" /></state>
  </xsl:template>

</xsl:stylesheet>

外部映射文件(您应该用自己的文件替换)是:

<?xml version="1.0"?>
<StateMapping>
  <Map name="New York">NY</Map>
  <Map name="California">CA</Map>
</StateMapping>

纽约
加利福尼亚州
输出为:

<?xml version="1.0"?>
<states>
  <state>NY</state>
  <state>CA</state>
</states>

纽约
加利福尼亚州

您能用状态列表(映射)的摘录来扩展您的问题吗?在XSLT 2.0中,您可以将映射表放在样式表的全局变量中。在纯1.0中,您无法做到这一点,但许多处理器提供的exslt:node-set()函数使之成为可能。很抱歉,我不能使用任何外部文件。您在外部文件中的状态列表不是如您的问题中所述的吗?不,我的意思是我的列表应该在XSLT中。然后您必须在XSLT中创建一个
数据岛。添加命名空间
xmlns:data=”http://...whatever“
位于顶部,并包括外部映射文件,在本例中,将顶级元素的名称空间替换为
。然后将变量中的表达式替换为
document(“”)/data:StateMapping
。错误:org.xml.sax.SAXParseException;systemId:file:/base/data/home/apps/s~xsltest-hrd2/5.391785634117992591/;行号:1;列数:1;prolog中不允许包含内容。我正在使用另一个东西进行转换。我可以将上面的模板调用到我的另一个模板吗?您不能使用联机XSLT服务来测试这一点,因为它需要document()函数找到一个实际的XSLT文件。@jyotishingh您的问题没有回答吗?