Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT,只获取标记中字符串的一部分_Xml_Xslt - Fatal编程技术网

Xml XSLT,只获取标记中字符串的一部分

Xml XSLT,只获取标记中字符串的一部分,xml,xslt,Xml,Xslt,好的,我有一个xslt样式表,它完成了我现在需要的大部分工作,看起来是这样的: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="//Product/Description"> <title> &l

好的,我有一个xslt样式表,它完成了我现在需要的大部分工作,看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="//Product/Description">
    <title>
      <xsl:apply-templates/>
    </title>
  </xsl:template>
  <xsl:template match="//Product/Picture">
    <link>
      <xsl:apply-templates/>
    </link>
  </xsl:template>
  <xsl:template match="//Product/Caption">
    <description>
      <xsl:apply-templates/>
    </description>
  </xsl:template>
  <xsl:template match="Picture">
    <xsl:param name="text"/>
    <xsl:choose>
      <xsl:when test="contains($text, '&lt;')">
        <xsl:value-of select="substring-before($text, '&lt;')"/>
        <xsl:call-template name="strip-tags">
          <xsl:with-param name="text" select="substring-after($text, 'src=')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="Caption">
    <xsl:param name="text"/>
    <xsl:choose>
      <xsl:when test="contains($text, '&lt;')">
        <xsl:value-of select="substring-before($text, '&lt;')"/>
        <xsl:call-template name="strip-tags">
          <xsl:with-param name="text" select="substring-after($text,'&gt;')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>
我想要的输出:

<item>
<title>
<![CDATA['DescriptionTag]]>  
</title>
<description>
<![CDATA[CaptionTagStrippedofEscapedCharacters]]>
</description>
<link>'UrlTag'</link>
<g:condition>new</g:condition>
<g:price>'BasePriceTag'</g:price>
<g:product_type>Clothing, Accessories</g:product_type>
<g:image_link>'PictureTagFrom 'src=' to '>' </g:image_link>
<g:payment_accepted>Visa</g:payment_accepted>
<g:payment_accepted>Mastercard</g:payment_accepted>
<g:payment_accepted>Discover</g:payment_accepted>
</item>  
有些标记不需要从源代码填充,但始终是相同的,例如“已接受付款”、“条件”和“产品类型”

不应该使用XML词汇表,也不应该使用希望将可解析数据作为未解析文本节点的XML使用者

如果您这样做,那么您必须面对后果并进行适当的解析,而不是进行一些容易出错的RegExp或字符串处理

用于正确编码格式良好的XHTML的非常基本的XSLT解析器位于


因此,您可以解析未解析的数据,然后使用节点集扩展功能应用第二阶段转换。

如果您添加原始XML和您想要完成的内容,即。,保罗:当我这样做的时候,人们给我的印象是这个问题太笼统了,我需要对这个问题有一个更基本的理解。所以我用这些乱七八糟的东西来解决一般问题。xml文件只是:在product元素中有一些其他未使用的标记。因此,上面的工作表为我做的是重命名每个元素的“标记”,然后复制/粘贴并添加适当的文件头。“picture”元素在我不需要的标记中有文本,所以我只想在src=before'>'之后有一个标记@bboyreason:制作一个输入XML和所需输出的非常简单的示例,并将它们添加到您的帖子中。如果没有这些,没有人会费力地浏览XSLT并试图猜测您想要做什么。@bboyreason:这与XSLT和xml几乎没有关系,您知道原因。试图去除不存在的标记是定义错误的,成功与否很大程度上取决于字符串的内容。和以前一样,我建议不要尝试这样做。它是错误和危险的,在任何时候,您的解决方案都可能产生非常错误的结果。一个解决方案是可能的,但它需要首先恢复真正的标记-这需要重新解析。在XSLT 3.0中,可以将字符串解析为XML,但在纯XSLT版本中,还没有已知的方法可以做到这一点。“1.0或2.0”。@Dimitre:我想我明白你的意思了,比如,如果我试图用预定义规则剥离的字符串包含奇数的'>',那么结果会很奇怪。我现在在上面发布的内容希望更清楚,通过xslt这样做是可行的,还是我应该采用一种完全不同的方法?@Alejandro:在我对OP的评论中,我对任何此类解决方案都提出了警告。尝试调用这个XML文档上的d-o-e模板,看看它会产生什么错误的结果:这是一个示例文本。这些标志和标志都被逃脱了@亚历杭德罗:酷,我在输出中没有看到任何逃逸的字符。现在我将检查这个“节点集”@Dimitre:是的,该解析器只适用于格式正确的XHTML。编辑。顺便说一句,我们不应该鼓励人们使用DOE机制的编码用例。@alejandro:你是说xml的格式不好?我想问的是,当我使用它时,它会去掉我用样式表在元素周围放置的标记。有没有办法把这些留在输出中?但是我想如果是xhtml的话not@bboyreason:我的意思是,您的文本节点必须具有经过正确编码且格式正确的XHTML片段。您的示例中的标题或图片元素中都不存在的内容。
<item>
<title>
<![CDATA['DescriptionTag]]>  
</title>
<description>
<![CDATA[CaptionTagStrippedofEscapedCharacters]]>
</description>
<link>'UrlTag'</link>
<g:condition>new</g:condition>
<g:price>'BasePriceTag'</g:price>
<g:product_type>Clothing, Accessories</g:product_type>
<g:image_link>'PictureTagFrom 'src=' to '>' </g:image_link>
<g:payment_accepted>Visa</g:payment_accepted>
<g:payment_accepted>Mastercard</g:payment_accepted>
<g:payment_accepted>Discover</g:payment_accepted>
</item>