Могу ли я получить значение из словаря контента с помощью xpath? - PullRequest
2 голосов
/ 10 июня 2019

Это пример метатега, из которого я хочу получить pub_date:

<meta name="parsely-page" content='{"title":"Article title","link":"https:\/\/site.com\/category\/article","type":"post","section":"category","image_url":"","author":null,"pub_date":"2009-03-01T14:17:14+00:00","post_id":"article_6463676334","tags":[]}' />

xpath для получения всего контента будет:

//meta[@name="parsely-author"]/@content

Можно ли получить значения ключей dict с помощью xpath?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

С XSLT 1.0 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="vQ">"</xsl:variable>
  <xsl:template match="/">
    <xsl:value-of select=
    'substring-before(substring-after(//meta[@name="parsely-page"]/@content,
                                      concat($vQ, "pub_date", $vQ, ":", $vQ)), $vQ)'/>
  </xsl:template>
</xsl:stylesheet>

Когда выполняется преобразование этого XML-документа (ваш метатег):

<meta name="parsely-page"
content='{"title":"Article title","link":"https:\/\/site.com\/category\/article","type":"post","section":"category","image_url":"","author":null,"pub_date":"2009-03-01T14:17:14+00:00","post_id":"article_6463676334","tags":[]}' />

желаемый результат получен :

2009-03-01T14: 17: 14 + 00: 00

Мы можем написать одно выражение XPath 1.0, которое вычисляется в требуемую строку , однако нам придется избегать кавычек и апострофов, чтобы избежать ошибок при их вложении, если они не экранированы:

substring-before(substring-after(//meta[@name="parsely-page"]/@content, 
                                 &apos;&quot;pub_date&quot;:&quot;&apos;), 
                 &apos;&quot;&apos;)

Проверка с использованием XSLT 1.0 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="vQ">"</xsl:variable>
  <xsl:template match="/">
    <xsl:value-of select=
    'substring-before(substring-after(//meta[@name="parsely-page"]/@content,
                                      &apos;&quot;pub_date&quot;:&quot;&apos;), 
                      &apos;&quot;&apos;)'/>
  </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к тому же XML-документу (выше), оно оценивает одно выражение XPath 1.0 и выводит требуемый, правильный результат:

2009-03-01T14: 17: 14 + 00: 00

0 голосов
/ 10 июня 2019

С XPath 3.1 вы можете сделать

//meta[@name="parsely-author"]/parse-json(@content)?pub-date

К сожалению, весьма вероятно, что вы используете процессор XPath, который поддерживает только XPath 1.0, и в этом случае вы не сможете использовать его, если не найдете другой процессор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...