Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
如何获得';键';从XSLT TBB中删除关键字?_Xslt_Tridion_Tridion 2011 - Fatal编程技术网

如何获得';键';从XSLT TBB中删除关键字?

如何获得';键';从XSLT TBB中删除关键字?,xslt,tridion,tridion-2011,Xslt,Tridion,Tridion 2011,我正在使用XSLT TBB(在Tridion 2011 SP1上使用XSLT中介)从关键字检索键值 我的关键字看起来像这样 Value: Some Value Key: Its ID is 123 这是一个普通的关键字 我已经创建了一个带有字段的模式。这些值将从列表和类别中选择 组件源如下所示: 这是直接取自Tridion UI组件的组件源 <Content xmlns="Some Name space"> <keywordlink xlink:href="tc

我正在使用XSLT TBB(在Tridion 2011 SP1上使用XSLT中介)从关键字检索键值

我的关键字看起来像这样

Value: Some Value   
Key: Its ID is 123
这是一个普通的关键字

我已经创建了一个带有字段的模式。这些值将从列表和类别中选择

组件源如下所示: 这是直接取自Tridion UI组件的组件源

<Content xmlns="Some Name space">
    <keywordlink xlink:href="tcm:202-9737-1024" xlink:title="Some Value"
        xmlns:xlink="http://www.w3.org/1999/xlink">Some Value</keywordlink>
</Content>

一些价值
当我从TemplateBuilder中查看tcm:Component源代码时,我发现该字段没有属性

  <Content xmlns="Some Name space">
    <keywordlink>Some Value</keywordlink>
  </Content>

一些价值
我想检索关键字的键值

我编写了一个类似这样的XSLT TBB。我正在使用XSLT中介来执行XSLT TBB

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:simple="Some Name space"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
  xmlns:xh="http://www.w3.org/1999/xhtml" 
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:transform-ext="urn:tridion:transform-ext" 
  xmlns="http://www.w3.org/1999/xhtml" 
  exclude-result-prefixes="#default simple xh">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:apply-templates 
            select="tcm:Component/tcm:Data/tcm:Content/simple:Content" />
    </xsl:template>

    <xsl:template match="simple:Content">
        <xsl:value-of  select="simple:keywordlink/@*"/>
        <xsl:value-of select=document(simple:keywordlink/@xlink:href)/>
    </xsl:template>
<xsl:stylesheet>

我得到了空白输出。我想得到关键字的键值

我得到的是空白输出,因为在tcm:Component XML中,没有属性

我不确定如何导航到该关键字

我应该检索键的值,即“其ID为123”


有人能帮上忙吗?

该关键字的关键字不存储在链接中(它实际上只包含查找关键字所需的最少信息)。因此,您必须加载关键字并从那里读取它

Yoav在这里展示了如何从XSLT中读取其他项:

这个片段似乎与此相关:

<xsl:attribute name="alt">
    <xsl:value-of select="document(simple:image/@xlink:href)/tcm:Component/tcm:Data/tcm:Metadata/image:Metadata/image:altText"/>
</xsl:attribute>
以这种方式实施:-

要获取值字段,请执行以下操作:-

document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Title/text()

<xsl:value-of select="document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Title/text()" />
要获取密钥字段,请执行以下操作:-

document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Key/text()

<xsl:value-of select="document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Key/text()" />

似乎仅仅使用XSLT中介器不可能在关键字字段中获得引用关键字的xlink:href

为了克服这一点,我创建了一个.NET化合物,它“膨胀”了XML中额外的关键字信息。您必须将这个复合词放在XSLT复合词之前

代码:


似乎您忘记提供源XML文档。。。在您的问题中提供的XML中没有类似于
tcm:Component/tcm:Data/tcm:Content
的内容。看看您的内容XML,您说的“Key”是指哪个属性?有一个href属性(tcm:202-9737-1024)和一个title属性。在XSLT示例中,文档(简单:KioWrdLink/@ xLink:HREF)看起来是从链接关键字中获取密钥的起点(当然,这是我对纯XSLT方法的考虑)。我感觉这里真正的问题是“关键字的XML结构是什么?”;)@弗兰克万帕夫伦。直接从Tridion UI获取的组件的XML与从template builder获取的tcm:component源有一些不同。在tcm:Component source中,我看不到“keylink”的任何属性。你能帮助我,我该如何解决我的问题。在这种情况下,你也可以通过文档(“tcm:1-23”)加载组件,并从那里获取xlink:href。很抱歉重新启动此主题,但我遇到了同样的问题。通过document()获取组件不会获得额外的属性。有谁能够通过组件xml获得关键字uri?
Some Value
document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Key/text()

<xsl:value-of select="document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Key/text()" />
Its ID is 123
namespace ContentManagement.TBB.Templates
{
   [TcmTemplateTitle("Inflate Keyword Info")]
    public class GetExtendedComponent : TemplateBase
    {
       public override void Transform(Engine engine, Package package)
       {
           Initialize(engine, package);

           Component component = GetComponent();
           XmlElement componentXml = component.ToXml();

           XmlNamespaceManager ns = new XmlNamespaceManager(componentXml.OwnerDocument.NameTable);
           ns.AddNamespace("ns", component.Schema.NamespaceUri);

           ItemFields fields = new ItemFields(component.Content, component.Schema);
           InflateKeywords(fields, (XmlElement)componentXml.SelectSingleNode(String.Format("//ns:{0}", component.Schema.RootElementName), ns));

           ItemFields metaFields = new ItemFields(component.Metadata, component.MetadataSchema);
           InflateKeywords(metaFields, (XmlElement)componentXml.SelectSingleNode("//ns:Metadata", ns));

           Item xmlItem = package.CreateStringItem(ContentType.Component, componentXml.OuterXml);
           package.Remove(package.GetByName(Package.ComponentName));
           package.PushItem(Package.ComponentName, xmlItem);
       }

       private void InflateKeywords(ItemFields fields, XmlElement element)
       {
           XmlNamespaceManager ns = new XmlNamespaceManager(element.OwnerDocument.NameTable);
           ns.AddNamespace("ns", element.NamespaceURI);
           Logger.Debug("NS: " + element.NamespaceURI);
           foreach (ItemField field in fields)
           {
               if (field is KeywordField)
               {
                   KeywordField keywordField = (KeywordField)field;

                   XmlNodeList nodes = element.SelectNodes(String.Format("./ns:{0}", keywordField.Name), ns);
                   foreach (XmlNode node in nodes)
                   {
                       XmlElement kwelement = (XmlElement)node;

                       Logger.Debug(String.Format("Keyword titel: {0}", keywordField.Value.Title));
                       Logger.Debug(String.Format("Keyword Element Value: {0}", kwelement.InnerText));

                       kwelement.SetAttribute("href", "http://www.w3.org/1999/xlink", keywordField.Values.First(v => v.Title.Equals(kwelement.InnerText)).Id);
                       kwelement.SetAttribute("type", "http://www.w3.org/1999/xlink", "simple");
                       kwelement.SetAttribute("title", "http://www.w3.org/1999/xlink", kwelement.InnerText);
                   }
               }
               else if (field is EmbeddedSchemaField)
               {
                   EmbeddedSchemaField embedField = (EmbeddedSchemaField)field;

                   XmlNodeList nodes = element.SelectNodes(String.Format("./ns:{0}", embedField.Name), ns);
                   int i = 0; 
                   foreach (XmlNode node in nodes)
                   {
                       XmlElement embedElement = (XmlElement)node;
                       InflateKeywords(embedField.Values[i], embedElement);
                       i++;
                   }
               }

           }
       }
    }
}