gpt4 book ai didi

xml - 基于已知 XSL 对未知 XML 进行逆向工程

转载 作者:行者123 更新时间:2023-12-04 06:46:17 25 4
gpt4 key购买 nike

解决了!

在遵循 Matti 的建议之后,我删除了自定义函数,一切都很好。

原帖:

到今天为止,我是 XSLT 的新手,所以我相信这对你们中的许多人来说是显而易见的。无论如何:

我的任务是为我公司的网站创建一个小部件,该小部件使用第三方供应商提供的数据。

供应商拒绝向我们发送示例 XML 文件(甚至是一个只有元素标签的空白文件!)所以我试图根据我在 XSLT 中看到的内容重新创建 XML,他们确实发送给我们。 ( mock 比比皆是)

这是我们发送的(剥离的)XSLT 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myCustXslFunctions="urn:CustomXslFunctions">

<xsl:variable name="NumberColumns" >1</xsl:variable>
<xsl:variable name="PaperId" >1234567890ABCDEF</xsl:variable>

<xsl:output method="html" version="1.0" encoding="UTF-8" indent="no" />
<xsl:template match="/NewDataSet">
<div><xsl:apply-templates select="/NewDataSet" mode="columns" /></div>
</xsl:template>

<xsl:template match="NewDataSet" mode="columns">
<xsl:for-each select="Table[position() mod $NumberColumns = 1 or $NumberColumns = 1]">
<p>
<xsl:for-each select=".|following-sibling::Table[position() &lt; $NumberColumns]">
<span class="description">
<xsl:element name="a">
<xsl:attribute name="target">_blank</xsl:attribute>
<xsl:attribute name="class" >description</xsl:attribute>
<xsl:choose>
<xsl:when test="retail='true'">
<xsl:attribute name="href">http://website/retail/?pid=<xsl:value-of select="$PaperId" />&#38;adid=<xsl:value-of select="paperitemid" /></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="href">http://website/?pid=<xsl:value-of select="$PaperId" />&#38;adid=<xsl:value-of select="paperitemid" /></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="imageurl != ''">
<xsl:element name="img">
<xsl:attribute name="src"><xsl:value-of select="imageurl" /></xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
<xsl:attribute name="class">thumbnail</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="img">
<xsl:attribute name="src">http://website/thumbs/<xsl:value-of select="paperid" />_<xsl:value-of select="paperitemid" />_100.jpg</xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
<xsl:attribute name="class">thumbnail</xsl:attribute>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</span>
</xsl:for-each>
</p>
<p>
<xsl:for-each select=".|following-sibling::Table[position() &lt; $NumberColumns]">
<span class="description">
<xsl:element name="a">
<xsl:attribute name="target">_blank</xsl:attribute>
<xsl:attribute name="class" >description</xsl:attribute>
<xsl:choose>
<xsl:when test="retail='true'">
<xsl:attribute name="href">http://website/?pid=<xsl:value-of select="$PaperId" />&#38;adid=<xsl:value-of select="paperitemid" /></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="href">http://website/?pid=<xsl:value-of select="$PaperId" />&#38;adid=<xsl:value-of select="paperitemid" /></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="string-length(shortdescr) = 0"><xsl:value-of select="myCustXslFunctions:MakeNice(descr,20,20,'Left','true')" /></xsl:when>
<xsl:otherwise><xsl:value-of select="myCustXslFunctions:MakeNice(shortdescr,20,20,'Left','true')" /></xsl:otherwise>
</xsl:choose>
</xsl:element>
</span>
</xsl:for-each>
</p>
</xsl:for-each>
</xsl:template>
</xsl:transform>

而我对 XML 进行逆向工程的微弱尝试:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="facepalm.xsl"?>
<NewDataSet>
<Table>
<paperid>123</paperid>
<paperitemid>12345</paperitemid>
<descr>facepalm of doom</descr>
<shortdescr>facepalm</shortdescr>
<retail>true</retail>
<imageurl>http://website/facepalm.jpg</imageurl>
</Table>
<Table>
<paperid>456</paperid>
<paperitemid>67890</paperitemid>
<descr>mega-sigh</descr>
<shortdescr>sigh</shortdescr>
<retail>true</retail>
<imageurl>http://website/sigh.jpg</imageurl>
</Table>
</NewDataSet>

在我看来,毫无疑问,我忽略了一些简单的事情,但我对 XSLT 的新手身份已经使这个项目成为一个多小时的项目。

任何帮助是极大的赞赏。

最佳答案

我的猜测更像是:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="facepalm.xsl"?>
<NewDataSet>
<Table>
<paperid>123</paperid>
<paperitemid>12345</paperitemid>
<descr>failvendor</descr>
<shortdescr>facepalm</shortdescr>
<retail>true</retail>
<imageurl>http://website/facepalm.jpg</imageurl>
</Table>
<Table>
<paperid>456</paperid>
<paperitemid>67890</paperitemid>
<descr>is fail</descr>
<shortdescr>sigh</shortdescr>
<retail>true</retail>
<imageurl>http://website/sigh.jpg</imageurl>
</Table>
</NewDataSet>
  • [] 的东西不是指元素名称的一部分,而是指元素的位置。所以元素名称只是 Table
  • 您错过了 descrpaperid 元素。

  • XSLT 似乎正在做的是在列中的列表中布置项目。是的,XSLT 就是这么复杂。

    此外,如果定义了 paperid,它似乎忽略了 paperitemidimageurl,如果提供了 descr,则忽略 shortdescr。这可能会帮助您完成任务。

    ...你应该如何在没有实际 XML 的情况下测试这个,顺便说一句?

    关于xml - 基于已知 XSL 对未知 XML 进行逆向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731630/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com