【问题标题】:Populating column dynamically from key value pair从键值对动态填充列
【发布时间】:2021-02-19 12:51:36
【问题描述】:

我正在使用 xslt 文件进行样式设置。我正在以表格格式显示一些内容。我需要从预定义的键值对中动态填充一列。 请看下面的例子

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
  <h2>Sample Transformation</h2>
    <table border="1">
    <xyz>msgprop</xyz>
      <tr bgcolor="#9acd32">
        <th>Id</th>
        <th>Name</th>
        <th>City</th>
      </tr>
      <xsl:for-each select="en:MyEvent">
      <tr>
        <td><xsl:value-of select="en:id"/></td>
        <td><xsl:value-of select="en:name"/></td>
        <td><xsl:value-of select="en:country"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

问题是我收到国家名称代替城市,我想用正确的城市填充城市列,为此我需要映射国家及其城市。有没有办法在键值对中预定义国家及其城市,当收到国家名称时,它将被城市名称替换(如果不存在,它将显示国家名称)。 有什么功能可以做到吗?如果你提供一个 sn-p 会很有帮助。

编辑:这里是xml

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <id>Empire Burlesque</id>
    <Name>Bob Dylan</Name>
    <country>USA</country>
  </cd>
  <cd>
    <id>Hide your heart</id>
    <name>Bonnie Tyler</name>
    <country>UK</country>
  </cd>
  <cd>
    <id>Greatest Hits</id>
    <name>Dolly Parton</name>
    <country>USA</country>
  </cd>
  <cd>
    <id>Still got the blues</id>
    <name>Gary Moore</name>
    <country>UK</country>
  </cd>
</catalog>

我需要一个映射,这样每当国家名称为英国时,它将被替换为与其他国家相同的首都伦敦。是否有某种方法可以将 UK 定义为键,将 London 定义为值,这样每当我收到作为 UK 的键时,它将被其值替换。请帮忙。

【问题讨论】:

  • 对于 XSLT 1,通常的方法是在一些 XML 文档(部分)中进行映射,然后简单地使用 XPath 来选择引用的值。 XSLT 3 有一个 map 数据类型,因此您不限于 XML。
  • 谢谢马丁,但不幸的是我不能使用单独的 xml 文件。我需要在同一个 xslt 中定义城市。
  • XSLT 是 XML,因此您可以将映射定义为 XSLT 文档的一部分,或者作为参数或变量,或者作为顶级的外部命名空间元素。不确定您在哪里苦苦挣扎,i am receiving country name in place of city 是什么意思,您甚至没有显示任何 XML 输入,您的 XSLT 也没有显示任何国家/地区数据或尝试处理它。
  • 用一个例子编辑了我的问题。请参考
  • @MartinHonnen 请看看这个问题。这看起来很干净。 stackoverflow.com/questions/66310526/…

标签: java xml xslt xslt-1.0 xslkey


【解决方案1】:

考虑以下示例:

XML

<events>
    <event>
        <id>001</id>
        <name>Alpha</name>
        <city>Paris</city>
    </event>
    <event>
        <id>002</id>
        <name>Bravo</name>
        <city>UK</city>
    </event>
    <event>
        <id>003</id>
        <name>Charlie</name>
        <city>Berlin</city>
    </event>
    <event>
        <id>004</id>
        <name>Delta</name>
        <city>USA</city>
    </event>
    <event>
        <id>005</id>
        <name>Echo</name>
        <city>Los Angeles</city>
    </event>
</events>

XSLT 1.0

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

<xsl:template match="/events">
    <html>
        <body>
            <h2>Sample Transformation</h2>
            <table border="1">
                <tr>
                    <th>Id</th>
                    <th>Name</th>
                    <th>City</th>
                </tr>
                <xsl:for-each select="event">
                    <tr>
                        <td>
                            <xsl:value-of select="id"/>
                        </td>
                        <td>
                            <xsl:value-of select="name"/>
                        </td>
                        <td>
                            <xsl:choose>
                                <xsl:when test="city = 'UK'">London</xsl:when>
                                <xsl:when test="city = 'USA'">Washington, D.C.</xsl:when>
                                <!-- add more key/value pairs here -->
                                <xsl:otherwise>
                                    <xsl:value-of select="city"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

结果(渲染):

【讨论】:

  • 非常感谢迈克尔,但我已经试过了。问题是,当我正在寻找一个更通用的解决方案时,而不是这样写,我可以在其中定义键值对,然后调用函数并查找输入键的值。 xslt中是否存在这样的东西?
  • 您可以将键/值对放在变量或元素中(正如 Martin Honnen 已经建议的那样)。然而,这样做并没有什么好处——相反,代码变得更复杂,效率更低。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多