代码之家  ›  专栏  ›  技术社区  ›  drudge

基于已知XSL的未知XML逆向工程

  •  2
  • drudge  · 技术社区  · 14 年前

    解决了的!

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

    到今天为止,我对XSLT还不熟悉,所以我相信这对你们中的许多人来说是一个不需要考虑的问题。总之:

    供应商拒绝向我们发送示例XML文件( )因此,我尝试根据他们发送给我们的XSLT中的内容重新创建XML。( )

    这是我们收到的(剥离的)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 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新手身份已经让这个项目花费了很多时间。

    非常感谢您的帮助。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Matti Virkkunen    14 年前

    我的猜测更像是:

    <?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>
    
    1. 这个 [] stuff不是指元素名的一部分,而是指元素的位置。所以元素名只是 Table .
    2. descr paperid

    而且,它似乎忽略了 纸张ID paperitemid 如果 imageurl 描述 如果 shortdescr

    …顺便说一句,如果没有实际的XML,您应该如何测试它?

        2
  •  1
  •   user764357 user764357    11 年前

    在一般情况下,仅给出XSLT就不可能确定输入XML文件的结构

    在本例中,您可能已经能够基于XSLT对XML描述进行反向工程,但在一般情况下,这是不可能正确执行的。在这种情况下,这是可能的,因为模板很小,使用 for-each .

    XSLT是 声明的 <xsl:apply-templates /> 无法洞察已知元素内部的元素。

    例如:

    <xsl:template match="book">
        <xhtml:div class="book">
            <xsl:apply-templates />
        </xhtml:div>
    </xsl:template>
    
    <xsl:template match="title">
        <xhtml:h1><xsl:value-of select="."/></xhtml:h1>
    </xsl:template>
    
    <xsl:template match="chapter/title">
        <xhtml:h2><xsl:value-of select="."/></xhtml:h2>
    </xsl:template>
    

    这本书有书名吗?书有章节吗?章节有标题吗?